我的ItemsControl
内嵌了自定义控件。我想要实现的是始终在TextBox
的末尾始终拥有WrapPanel
控制以及我的自定义控件。
这是一个小小的预览:
让ItemsControl
允许我们拥有相同类型的控件。在TextBox
之后添加ItemsControl
时,很遗憾会出现在新行上。因此,我不得不以某种方式在TextBox
中附加ItemsControl
和我的自定义控件。
<ItemsControl ItemsSource="{Binding MyItems}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<!-- Make items wrap -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- Custom control -->
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:CustomControl />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<!-- This should be inside items control -->
<TextBox />
我做了一些研究,结果证明我可以使用DataTemplateSelector
类和ItemTemplateSelector
,这样我就可以为不同的项目选择模板。
这当然是一个选项,但是它需要我将TextBox插入我的MyItems
(这是ObservableCollection顺便说一句)。我不确定这是否是要走的路,因为我必须找到TextBox并在ObservableCollection
的末尾移动它,每次添加新项目时......
所以问题是:解决这个问题的正确方法是什么?寻找有经验的开发者对此的看法。
答案 0 :(得分:2)
您可以将ItemsSource
设置为CompositeCollection:
<ItemsControl ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ItemsControl.Resources>
<CollectionViewSource x:Key="cvs" Source="{Binding MyItems}" />
</ItemsControl.Resources>
<ItemsControl.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource cvs}}" />
<!-- This should be inside items control: -->
<TextBox />
</CompositeCollection>
</ItemsControl.ItemsSource>
<!-- Make items wrap -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- Custom control -->
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:CustomControl />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>