1

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

所以; 我是否必须在转换器中连接事件处理程序以手动保持转换后的集合与原始集合同步,还是有更好的方法来处理这个?我想如果不实际创建新集合就无法进行转换?或者我可以以某种巧妙的方式进行绑定,这样我就不必进行转换?

4

2 回答 2

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);
    }
于 2010-09-09T11:26:48.537 回答
0

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

于 2010-09-09T11:26:22.290 回答