当 ObservableCollection 改变 WP7 时更新 CollectionViewSource

Jos*_*ose 5 silverlight windows-phone-7

我有一个ObservableCollection用于我的基础项目列表。我有 2 个CollectionViewSource不同的数据过滤器。我希望发生的任何更改都反映在CollectionViewSource.

在我的视图模型构造函数中,我设置了过滤谓词。然后我获取数据并将其添加到ObservableCollection. 我订阅了该CollectionChanged事件,并且正在那里刷新 CVS。

不过,我看到了一些非常奇怪的事情。ListBox绑定到 CVS的项目不会出现在我的项目中,或者会出现重复项。如果我RefreshCollectionChanged更改 之后在事件之外调用CVS ObservableCollection,一切似乎都正常。我真的希望能够在集合更改时刷新,而不必担心每次完成更改它的操作时都必须调用刷新。

public MyViewModel()
{
    oc.CollectionChanged += OcCollectionChanged;

    cvs1.Source = oc;
    cvs1.View.Filter = new Predicate<object>( ... );

    cvs2.Source = oc;
    cvs2.View.Filter = new Predicate<object>( ... );

    foreach( var data in myData )
    {
        oc.Add( data );
    }
}

private void OcCollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
{
    cvs1.View.Refresh();
    cvs2.View.Refresh();
}
Run Code Online (Sandbox Code Playgroud)

Der*_*kin 4

CollectionViewSource没有实现INotifyPropertyChanged,因此要将任何底层数据更改添加到 UI 中,您需要Refresh像您已经在做的那样调用 View。也是与数据源无关的,因此源是引发属性更改通知的CollectionViewSource事实并不重要,因为它没有监听。ObservableCollectionCollectionViewSource

我认为当集合更改时手动刷新视图的解决方案是您无需重新考虑数据结构即可获得的最佳解决方案。