如何观察转换后的集合?

时间:2010-09-09 11:05:23

标签: .net wpf ivalueconverter

我将一个集合ObservableCollection<Foo>绑定到我的控制器上的依赖项属性,但是我通过IValueConverter运行它以使其成为ObservableCollection<object>,这是我的控制器所期望的。转换工作正常 - 我创建了一个ObservableCollection<object>并用原始列表中的所有Foo填充它。然而,这带来了一个问题,即现在我正在观察在值转换器中创建的集合,因此没有看到对原始集合的任何更改。

因此;我是否必须在转换器中连接事件处理程序以手动保持转换的集合与原始集合同步,或者有更好的方法来处理它吗?我想我不能在没有实际创建新集合的情况下进行转换?或者我可以用一些聪明的方式进行绑定,这样我就不必进行转换了吗?

2 个答案:

答案 0 :(得分:1)

我不知道它是否有帮助,但通常在ViewModel中,我声明IList或其他不太具体的接口作为属性类型而不是特定的接口。

然后我可以将所有的集合和列表绑定到这个属性上。

设置属性后,我会检查它是否实现INotifyPropertyChanged,如果是,我附加了一个CollectionChanged-EventHandler。当新属性发生变化时,我会从旧INotifyPropertyChanged中删除EventHandler(如果是)。

这样做的缺点是,ViewModel必须准备好查看除预期之外的其他类型的对象。但这通常是一项简单的工作。

void YourDPValueChanged(DependencyPropertyChangedEventArgs e) {
    INotifyCollectionChanged newCollection = e.NewValue as INotifyCollectionChanged;
    INotifyCollectionChanged oldCollection = e.OldValue as INotifyCollectionChanged;
    if (null != newCollection) {
        newCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(Collection_CollectionChanged);
    }
    if (null != oldCollection) {
        oldCollection.CollectionChanged -= new NotifyCollectionChangedEventHandler(Collection_CollectionChanged);
    }

答案 1 :(得分:0)

如果我理解正确你绑定某种ICollection,它没有通过创建一个新的ObservableCollection的转换器实现INotifyCollectionChanged。在这种情况下,您不会从现在断开连接的集合中获得任何好处。 是否可以直接绑定您的集合(无需转换)并直接在您的对象上实现INotifyPropertyChanged和/或INotifyCollectionChanged?