我有一个自定义控件对象的ObservableCollection。
ObservableCollection<MyStatusBar> MyUIObjects = new ObservableCollection<MyStatusBar>();
自定义控件是一个用户控件,像这样
public partial class MyStatusBar : UserControl, INotifyPropertyChanged
有什么最简单的方法可以将我的控件列表绑定到堆栈面板上,让它们显示出来。目前,当我绑定它们时,没有任何东西显示出来。当我手动将控件添加到StackPanel.Children集合中时,它们就会显示出来,但我想通过绑定来实现。
MyStatusBar
不应该是一个 UserControl
但POCO。
public class MyStatusBar : INotifyPropertyChanged { ... }
你可以使用 ItemsControl
绑定到 ObservableCollection<MyStatusBar>
并定义一个 ItemTemplate
在你放的地方 UserControl
要为每个POCO对象渲染。
<ItemsControl ItemsSource="{Binding MyUIObjects}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:MyStatusBarUserControl />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
该 ItemsPanelTemplate
指定面板--在本例中是一个 StackPanel
- 该 ItemsPresenter
中的项目的布局而创建的。ItemsControl
.
注意到 MyStatusBar
和 MyStatusBarUserControl
是不同的类型。视图模型不应该创建或暴露UI元素。它应该暴露数据对象。然后,您可以通过使用 ItemTemplate
.
请查看代码片段.将Itemcontrol替换为任何itemscontrols',如listbox等,否则,你仍然可以使用Itemscontrol。
<ItemsControl ItemsSource="{Binding MyUIObjects}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>