2

我有一个应该绑定到两个s (和)的ObservableCollection<MyClass>名称。myCollectionCollectionViewSourceAllItemsSelectedItems

AllItems的源属性绑定到myCollection. SelectedItems的源属性应该绑定myCollectionIsSelected == true.

public class MyClass : INotifyPropertyChanged
{
    //fields and interface implementations
    public string Name {//proper code};
    public bool? IsSelected {//proper code};
}

// some where else in the MainWindow
AllItems.Source = myCollection;
SelectedItems.Source = myCollection.Where(input=>input.IsSelected==true);

问题:加载 Window 时一切正常。但是当 中的IsSelected某些项目的值myCollection明显改变时,它对SelectedItems. 因此,为了克服这个问题,我SelectedItems每次IsSelected更改属性时都会更新源属性。

问题:如何进行此类绑定,以便无需手动更新源属性SelectedItems

谢谢。

4

2 回答 2

1

变化后MyClass你应该加注PropertyChanged Event

如果您已经这样做了,那么您应该查看您SelectedItems.Source的调试模式。也许它已经存在正确的值,但它没有显示给你。

我的意思是如果SelectedItems.Source属于一些可见的元素 - GUI - 你应该在屏幕上刷新它。导致值存在的另一种方式,但在重新绘制屏幕上的元素之前不会显示。

于 2013-04-02T12:55:22.047 回答
1

首先,您应该无条件地删除您的手动过滤设置,并将其替换为更合适的设置。替换什么的选择主要取决于您所针对的 .NET 版本。

如果以 .NET 4.5 为目标,那么一个简单的解决方案是在集合视图上启用实时过滤。

对于早期版本的 .NET,无论如何您都必须做一些手动工作,但最好只调用Refresh重新绑定控件的集合视图。为此,您应该通过Filter从 XAML 设置事件处理程序来将筛选推迟到集合视图本身。

于 2013-04-02T13:04:24.843 回答