我有自定义控件ListItem
。我需要在一个窗口中显示五个这样的项目,这些项目可能会在运行时更改;可以添加或删除项目,也可以在ListItem
中更改内容。
ListBox似乎是显示项目的好方法。但我所看到的是我们可以添加项目并设置样式,并可以使用数据触发器处理更新。
myListBox.Items.Add(new { FileName = "SomeFile", State="Uploaded" });
但我们不能做像
这样的事情ListItem curItem = new ListItem();
myListBox.Items.Add(new { curItem });
即使我这样做,也会在列表中显示空白项目。
因此,如果我想将自定义控件添加到某个列表框中,那怎么可能呢?这就是将ListBox用作容器,这样我们就可以摆脱定位的痛苦以及列表更改后的所有内容。或者有更好的方法吗?
答案 0 :(得分:2)
你很幸运 - 这是WPF的面包和黄油!设置ListBox的ItemsSource(可能在XAML或cs中):
myListBox.ItemsSource = myEnumerableCollection;
或
<ListBox ItemsSource="{Binding MyItemsProperty}">
使用DataTemplate(您不需要UserControl)来设置XAML中每个项目的样式:
<ListBox ItemsSource="{Binding MyItemsProperty}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding FileName}"/>
<TextBlock Text="{Binding State}"/>
<!--Whatever you want-->
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
如果您的收藏集是ObservableCollection<T>对该收藏集的更改(例如添加或删除的项目),则会自动反映在ListBox中。如果T实现INotifyPropertyChanged,则每个项目的属性更改也会自动显示在UI上。
有关详情,请参阅WPF Binding Overview。
答案 1 :(得分:0)
不要在WPF中的过程代码中创建或操作UI元素。
<ListBox ItemsSource="{Binding SomeCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<my:MyControl/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
其中my:MyControl
是UserControl
,其中包含您想要的任何UI。