.net 如何观察已转换的集合?

.net 如何观察已转换的集合?,.net,wpf,ivalueconverter,.net,Wpf,Ivalueconverter,我将集合observateCollection绑定到控制器上的依赖项属性,但我通过一个IValueConverter运行它,使其成为observateCollection,这正是我的控制器所期望的。转换工作正常-我创建了一个可观测集合,并用原始列表中的所有Foo填充它。然而,这带来了一个问题,即现在我正在观察在值转换器中创建的集合,因此没有看到对原始集合的任何更改 所以,;我是否必须在转换器中连接EventHandler以手动保持转换后的集合与原始集合同步,或者是否有更好的方法来处理此问题?我想

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


所以,;我是否必须在转换器中连接EventHandler以手动保持转换后的集合与原始集合同步,或者是否有更好的方法来处理此问题?我想我不能在不创建新集合的情况下进行转换?或者我可以用某种巧妙的方式进行绑定,这样我就不必进行转换了

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

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

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

然后我可以将所有集合和列表绑定到此属性

设置属性时,我会检查它是否实现了
INotifyPropertyChanged
,如果是,我会附加CollectionChanged事件处理程序。当新更改属性时,我将从旧的
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);
    }

我不知道它是否有用,但通常在ViewModel中,我将
IList
或另一个不太特定的接口声明为属性类型,而不是特定的接口

然后我可以将所有集合和列表绑定到此属性

设置属性时,我会检查它是否实现了
INotifyPropertyChanged
,如果是,我会附加CollectionChanged事件处理程序。当新更改属性时,我将从旧的
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);
    }

谢谢你的关注。我试过了,但似乎没用。我通常也使用IList,但我相信问题在于列表中包含的对象的类型。我希望对象列表可以绑定任何内容的列表,但只有当我将完全相同类型的集合绑定到该列表时,依赖项属性才会被触发—同样是在使用IList时。@stiank81:这看起来是绑定的问题:ObservableCollection实现了集合,而此实现了IList。因此,它不可能是包含类型的问题。我是否正确理解初始设计:您的ViewModel具有这个IList属性,并且您从视图绑定了一个ObservableCollection到它。对吗?我的ViewModel有一个ObservableCollection,在我的视图中,我有一个属性为ObservableCollection的控件,我将ObservableCollection绑定到该控件。由于类型不匹配,绑定未被应用,并且似乎我必须更改其中一个以在绑定中获得匹配。这就是我尝试使用IValueConverter解决的问题,但是在这两者之间我得到了一个额外的集合,这意味着我失去了对我的ViewModel中原始ObservableCollection的跟踪。@stiank81:好的,在这种情况下,如果您不想将ViewModel的属性更改为IList或IEnumerable,我认为您必须编写一个转换器来进行转换,并连接CollectionChanged事件的源集合和目标集合。另一个想法是在ViewModel中添加第二个属性,该属性与特定属性具有相同的用途,但支持IList?这使得虚拟机有点复杂,但是你有两个选择,一个是强类型的,一个是泛型的。是的,看起来这就是解决方案。。我已经考虑过在我的ViewModel中添加一个通用列表,但我不想这样做。。谢谢你的意见!谢谢你的关注。我试过了,但似乎没用。我通常也使用IList,但我相信问题在于列表中包含的对象的类型。我希望对象列表可以绑定任何内容的列表,但只有当我将完全相同类型的集合绑定到该列表时,依赖项属性才会被触发—同样是在使用IList时。@stiank81:这看起来是绑定的问题:ObservableCollection实现了集合,而此实现了IList。因此,它不可能是包含类型的问题。我是否正确理解初始设计:您的ViewModel具有这个IList属性,并且您从视图绑定了一个ObservableCollection到它。对吗?我的ViewModel有一个ObservableCollection,在我的视图中,我有一个属性为ObservableCollection的控件,我将ObservableCollection绑定到该控件。由于类型不匹配,绑定未被应用,并且似乎我必须更改其中一个以在绑定中获得匹配。这就是我尝试使用IValueConverter解决的问题,但后来我在be中得到了一个额外的集合