WPF Listview-根据按钮点击显示来自不同ObservableCollections的数据的最佳方法是什么?

时间:2010-03-24 00:29:27

标签: c# wpf data-binding listview

我有三个ObservableCollections:CharacterCollection,LocationCollection和ItemCollection。它们都是对象的集合; CharacterCollection是Character Objects的集合。我需要在列表视图中显示用户点击按钮确定的集合中的信息。 我更喜欢使用数据绑定,但是我没有看到使用包含不同类型对象的多个集合的明确方法。什么是在集合之间轻松切换的最佳方式?

- 编辑 -

我遇到的一个主要问题是不同的集合每个都需要不同数量的行和不同的行标题。

3 个答案:

答案 0 :(得分:2)

在ViewModel(或代码隐藏)上只有一个IList属性,例如:

private IList currentCollection;
public IList CurrentCollection
{
   get { return this.currentCollection; }
   set
   {
       if (this.currentCollection != value)
       {
           this.currentCollection = value;
           var handler = this.PropertyChanged;
           if (handler != null)
               handler(this, new PropertyChangedEventArgs("CurrentCollection");
       }
   }

完成后,当您想要切换要查看的集合时,只需设置CurrentCollection = ItemCollection;即可。 ListView使用的DataTemplates可以毫无问题地处理不同类型的对象。

答案 1 :(得分:1)

可能比Reed Copsey更简单的解决方案:创建三个不同的ListView s,而不是弄乱ListView的绑定,并让按钮确定哪一个可见。我是这样做的还是Reed的方式主要取决于你还没有告诉我们的事情。

修改

为了回答你的问题,我们将走出“更加简单”的领域,进入“为什么WPF非常棒”的领域。

事实上,更多WPFish,MVVMish做事的方法是为你的三种集合类型中的每一种创建一个子类 - 例如一种名为CharactersCollection的类型,它是ObservableCollection<Character>的子类。然后为每个类型添加DataTemplate到资源字典:

<DataTemplate DataType="CharactersCollection">
  <ListView ItemsSource="{Binding}">
     <!-- specific column definitions for character information goes here -->
  </ListView>
</DataTemplate>

现在,只要WPF中的任何内容需要呈现CharactersCollection,它就会找到该模板并使用它。

在视图模型类中,您可以创建如下属性:

private object _ActiveCollection;
public object ActiveCollection
{
   get { return _ActiveCollection; } 
   set
   {
      _ActiveCollection = value;
      OnPropertyChanged("ActiveCollection");
   }
}

够简单吧?哪个系列有效?完成此操作后,需要显示ActiveCollection属性的任何内容,如下所示:

<ContentControl Content="{Binding ActiveCollection}"/>

将使用适用于活动集合的类型DataTemplate呈现活动集合。

由于您已实施INotifyPropertyChanged,因此无论何时设置 ActiveCollection,其当前值都将使用相应的模板呈现。因此,现在您需要做的所有按钮都是在作为绑定源的对象上设置属性。 (或者绑定到Command这样做的对象,但是在我们跑之前让它们走。)

答案 2 :(得分:0)

WPF CompositeCollection将处理包含任何类型对象的集合,并且也是可观察的。

更强类型的另一个选项是从要绑定到的所有集合的公共基础clase继承。然后你可以创建一个通用的ObservableCollection属性,以ObservableCollection的形式绑定。