使用 WrapPanel 添加一个 TextBox 作为 ItemsControl 的最后一个元素

Posted

技术标签:

【中文标题】使用 WrapPanel 添加一个 TextBox 作为 ItemsControl 的最后一个元素【英文标题】:Add a TextBox as the last element of an ItemsControl with WrapPanel 【发布时间】:2016-05-05 10:45:17 【问题描述】:

我正在尝试实现以下扫描

目前接近

尝试使用 ItemsControl(使用 WrapPanel)和包裹在 WrapPanel 中的 TextBox 来实现它,但它没有所需的输出,因为有两个 WrapPanel 分别包裹

<toolkit:WrapPanel Orientation="Horizontal">
     <ItemsControl ItemsSource="Binding someThing">
         <ItemsControl.ItemTemplate>
              <DataTemplate>
                   <Grid>
                       <Border>
                           <TextBlock Text="somesomething" />
                       </Border>
                   </Grid>
               </DataTemplate>
         </ItemsControl.ItemTemplate>
         <ItemsControl.ItemsPanel>
             <ItemsPanelTemplate>
                <toolkit:WrapPanel Orientation="Horizontal" />
              </ItemsPanelTemplate>
          </ItemsControl.ItemsPanel>
      </ItemsControl>
      <TextBox/>
 </toolkit:WrapPanel>

我正在考虑是否可以在 ItemsControl 的末尾添加 TextBox,但没有这样做。请说明我的任何方法是否有其他解决方法/解决方案

【问题讨论】:

【参考方案1】:

ItemsControl需要使用DataTemplateSelector,并为不同的列表项指定不同的模板。

public class BlockItem

    // TODO


public class BoxItem

    // TODO


public class MyTemplateSelector : DataTemplateSelector

    public DataTemplate BlockTemplate  get; set; 
    public DataTemplate BoxTemplate  get; set; 

    protected override DataTemplate SelectTemplateCore(object item)
    
        if (item is BlockItem) return BlockTemplate;
        else if (item is BoxItem) return BoxTemplate;

        return base.SelectTemplateCore(item);
    

XAML:

<ItemsControl ItemsSource="Binding someObject">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <toolkit:WrapPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplateSelector>
        <local:MyTemplateSelector>
            <local:MyTemplateSelector.BlockTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="something"/>
                    </Grid>
                </DataTemplate>
            </local:MyTemplateSelector.BlockTemplate>
            <local:MyTemplateSelector.BoxTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBox Text="something"/>
                    </Grid>
                </DataTemplate>
            </local:MyTemplateSelector.BoxTemplate>
        </local:MyTemplateSelector>
    </ItemsControl.ItemTemplateSelector>
</ItemsControl>

然后您将不同类型的对象添加到您的项目源:

someObject.Add(new BlockItem());
someObject.Add(new BlockItem());
someObject.Add(new BlockItem());
someObject.Add(new BlockItem());
someObject.Add(new BoxItem());

如果您希望TextBox 成为最后一个元素,那么您需要它成为ItemsSource 列表中的最后一项。

【讨论】:

以上是关于使用 WrapPanel 添加一个 TextBox 作为 ItemsControl 的最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章

WPF: WrapPanel 容器的数据绑定(动态生成控件遍历)

WPF: WrapPanel 容器的模板数据绑定(ItemsControl)

WPF WrapPanel与Grid布局

WrapPanel 作为 ItemsControl 的 ItemPanel

UWP 中 ListBox 内的 WrapPanel

WPF,制作填空题