0

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

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

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

但我们不能做类似的事情

ListItem curItem = new ListItem();
myListBox.Items.Add(new { curItem });

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

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

4

2 回答 2

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 绑定概述

于 2013-09-25T01:24:23.817 回答
0

不要在 WPF 的过程代码中创建或操作 UI 元素。

<ListBox ItemsSource="{Binding SomeCollection}">
   <ListBox.ItemTemplate>
     <DataTemplate>
       <my:MyControl/>
     </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

哪里my:MyControlUserControl你想要的任何用户界面。

于 2013-09-25T01:13:20.343 回答