【问题标题】:Add a TextBox as the last element of an ItemsControl with WrapPanel使用 WrapPanel 添加一个 TextBox 作为 ItemsControl 的最后一个元素
【发布时间】: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,但没有这样做。请说明我的任何方法是否有其他解决方法/解决方案

【问题讨论】:

    标签: c# xaml windows-phone itemscontrol


    【解决方案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 列表中的最后一项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2019-08-19
      • 2016-08-28
      • 2011-03-09
      • 2020-07-02
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多