2010-09-09 126 views
1

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

所以;是否必须在转换器中挂接事件处理程序以手动将转换后的集合与原始集合保持同步,还是有更好的方法来处理这个问题?我想我不能在没有创建新集合的情况下进行转换?或者我能否以一种聪明的方式进行绑定,这样我就不必进行转换了?

回答

1

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

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

虽然属性设置,我检查它是否实现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); 
    } 
+0

Thx为您的关注。我试过了,但它似乎没有帮助我。我通常也使用IList,但我相信问题是列表中包含的对象的类型。我希望对象列表可以有一个绑定到它的任何列表,但只有当我将一个完全相同类型的集合绑定到它时才会触发依赖项属性 - 当使用IList时也是如此。 – stiank81 2010-09-09 11:41:50

+0

@ stiank81:这看起来像这是绑定的问题:ObservableCollection implements Collection 并且这实现了IList。因此它不能成为包含类型的问题。我是否了解最初的设计权限:您的ViewModel具有此IList属性,并且您从View an ObservableCollection 到它。对? – HCL 2010-09-09 11:50:32

+0

我的ViewModel有一个ObservableCollection ,在我看来我有一个属性ObservableCollection 的控件,我将ObservableCollection 绑定到。由于类型不匹配,不会应用绑定,并且看起来我必须更改其中的一个才能在绑定中获得匹配。这就是我尝试使用IValueConverter解决的问题,但后来我在其间收集了一个额外的集合,这意味着我忽略了ViewModel中原始ObservableCollection的轨道。 – stiank81 2010-09-09 11:55:24

0

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

+0

对不起,如果问题不清楚 - 代码的某些部分没有显示,但我现在添加了代码块。我将一个ObservableCollection绑定到一个ObservableCollection属性。问题是元素的类型,这就是为什么我必须添加一个转换器(或者有更好的方法?)。在转换器中创建了一个新的集合,这使我无法观察原始集合。问题是如何最好地保持观察原始的。我可以添加更聪明的绑定吗?或者我需要手动保持同步。 – stiank81 2010-09-09 11:48:48