代码之家  ›  专栏  ›  技术社区  ›  stiank81

如何观察转换后的收藏品?

  •  1
  • stiank81  · 技术社区  · 14 年前

    我绑定一个集合 ObservableCollection<Foo> 到我的控制器上的依赖属性,但我通过一个ivalueConverter来运行它。 ObservableCollection<object> 相反,这是我的控制器所期望的。转换工作正常-我创建一个 ObservableCollection<对象> 把原来名单上所有的foo都填进去。然而,这带来了一个问题,即现在我正在观察在值转换器中创建的集合,因此没有看到对原始集合的任何更改。

    那么,我是否必须在转换器中挂接事件处理程序以手动使转换后的集合与原始集合保持同步,或者是否有更好的方法来处理这种情况?我想我不能不创建一个新的集合就进行转换吗?或者我可以用一些巧妙的方法来装订,这样我就不需要转换了吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   HCL    14 年前

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

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

    设置属性时,我检查它是否实现 INotifyPropertyChanged 如果是,我附加一个CollectionChanged事件处理程序。当属性发生新的更改时,我将从旧的 InotifyProperty已更改 (如果是这样)。

    其缺点是,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);
        }
    
        2
  •  0
  •   MrDosu    14 年前

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