ListView中的集合中有多个IsSelected

时间:2012-02-03 10:11:34

标签: c# wpf listview mvvm

  

可能重复:
  ObservableCollection that also monitors changes on the elements in collection

我在WPF中有一个应用程序,但我想将(全部或部分)转换为MVVM。

我创建了一个viewmodel,它指向一些ObservableCollections显示在列表视图中(一次一个,可以用单选按钮更改)。

当集合被更改时,我会收到通知,但是当集合中的某个项目发生更改时(即IsSelected从false / true更改,反之亦然),我不会收到通知。

我可以看到让它工作的唯一方法是订阅每个项目的notifypropertychanged事件处理程序,并在进行新的选择以删除订阅并订阅另一个集合的事件时,但这似乎在至少不是最理想的解决方案。

什么解决方案适合这个问题?我检查了一些类似的帖子,但它们似乎有点不同。

1 个答案:

答案 0 :(得分:1)

ObservableCollection只监听集合本身的变化。它不负责收听对集合中的项目所做的更改。如果你想要这种行为,你必须自己添加它。

通常我会在CollectionChanged事件中添加一些内容,这会将PropertyChanged个事件添加/删除到集合中的项目。

void MyCollection_CollectionChanged(object sender, CollectionChangedEventArgs e)
{
    if (e.NewItems != null)
    {
        for each (SomeObject item in e.NewItems)
            item.PropertyChanged += SomeObject_PropertyChanged;
    }

    if (e.OldItems != null)
    {
        for each (SomeObject item in e.OldItems)
            item.PropertyChanged -= SomeObject_PropertyChanged;
    }
}

void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{

    // Handle event however you want here

    // For example, simply raise property change to refresh collection
    RaisePropertyChanged("MyCollection");

    // Or move item to new collection if it's selected
    if (e.Property == "IsSelected")
    {
        var item = object as SomeItem;
        MyCollectionA.Remove(item);
        MyCollectionB.Add(item);
    }
}