C# 向listbox添加自定义控件
我有一个自定义控件C# 向listbox添加自定义控件,c#,wpf,xaml,listbox,C#,Wpf,Xaml,Listbox,我有一个自定义控件ListItem。我需要在一个窗口中显示五个这样的项目,这些项目可能会在运行时发生变化;可以添加或删除项目,也可以在ListItem中更改内容 ListBox似乎是显示项目的一个很好的解决方案。但我看到的是,我们可以添加项目并设置它们的样式,还可以使用数据触发器处理更新 myListBox.Items.Add(new { FileName = "SomeFile", State="Uploaded" }); 但我们不能做类似的事情 ListItem curItem = new
ListItem
。我需要在一个窗口中显示五个这样的项目,这些项目可能会在运行时发生变化;可以添加或删除项目,也可以在ListItem
中更改内容
ListBox似乎是显示项目的一个很好的解决方案。但我看到的是,我们可以添加项目并设置它们的样式,还可以使用数据触发器处理更新
myListBox.Items.Add(new { FileName = "SomeFile", State="Uploaded" });
但我们不能做类似的事情
ListItem curItem = new ListItem();
myListBox.Items.Add(new { curItem });
即使我这样做了,它也会在列表中显示空项
所以,如果我想将自定义控件添加到某个列表框中,那怎么可能呢。这就是将ListBox用作一个容器,这样我们就可以摆脱定位的痛苦以及列表更改后的所有痛苦。或者有更好的方法吗?不要在WPF的过程代码中创建或操作UI元素
<ListBox ItemsSource="{Binding SomeCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<my:MyControl/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
其中
my:MyControl
是一个UserControl
,具有您想要的任何UI。您很幸运-这是WPF的面包和黄油!设置列表框的ItemsSource(可能在XAML或cs中):
或
使用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>
如果您的集合是一个集合,则对该集合的更改(例如添加或删除的项目)将自动反映在列表框中。如果T实现了对每个项目属性的更改,那么它也会自动显示在UI上
有关详细信息,请参见。为什么要创建ListBoxItem,然后将其添加到匿名类型,然后添加到ListBox?为什么不将ListBoxItem添加到ListBox,甚至更好地将一个项目绑定到ListBox,让绑定完成所有工作并使用数据模板。是的,你是对的,但问题是该项目有点复杂,所以我想独立地管理项目,像每个项目一样,照顾自己,像处理不同的事件样式等。但这个选项仍然是开放的。如果您有一个复杂的ListItem,为什么要通过将它添加到匿名对象来使它更复杂,这将使Xaml很难显示您想要的内容,请尝试:
myListBox.items.Add(curItem);
而不是myListBox.Items.Add(新的{curItem})
因此,底线是您认为最好将项目源绑定到列表,事实上,我上周开始使用wpf,所以仍然在寻找方法以尽可能最好的方式进行操作。在这种情况下,我认为直接将这五个元素添加到窗口有点短视,没有考虑管理删除和添加是的绑定到类集合并应用DataTemplates,然后将UserControls添加到列表框中,这并不是说将UserControls集合添加到绑定列表中是一件坏事,而是使用DataTemplates的简单类将快约400%。WPF都是由数据绑定提供动力的,因此超出该规则将创建biiiggg headachesYeah right决定不使用自定义控件,将使用可观察集合。
<ListBox ItemsSource="{Binding MyItemsProperty}">
<ListBox ItemsSource="{Binding MyItemsProperty}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding FileName}"/>
<TextBlock Text="{Binding State}"/>
<!--Whatever you want-->
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>