将自定义控件添加到列表框

时间:2013-09-25 00:51:31

标签: c# wpf xaml listbox

我有自定义控件ListItem。我需要在一个窗口中显示五个这样的项目,这些项目可能会在运行时更改;可以添加或删除项目,也可以在ListItem中更改内容。

ListBox似乎是显示项目的好方法。但我所看到的是我们可以添加项目并设置样式,并可以使用数据触发器处理更新。

myListBox.Items.Add(new { FileName = "SomeFile", State="Uploaded" });

但我们不能做像

这样的事情
ListItem curItem = new ListItem();
myListBox.Items.Add(new { curItem });

即使我这样做,也会在列表中显示空白项目。

因此,如果我想将自定义控件添加到某个列表框中,那怎么可能呢?这就是将ListBox用作容器,这样我们就可以摆脱定位的痛苦以及列表更改后的所有内容。或者有更好的方法吗?

2 个答案:

答案 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:MyControlUserControl,其中包含您想要的任何UI。