Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向listbox添加自定义控件_C#_Wpf_Xaml_Listbox - Fatal编程技术网

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>