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

Add a TextBox as the last element of an ItemsControl with WrapPanel

我正在尝试实施以下扫描器

到目前为止的方法

尝试使用一个 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,但没有成功。请说明我的任何方法是否有任何其他解决方法/解决方案

您需要为 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 列表中的最后一项。