我有一个名为ObservableCollection<MyClass>
的{{1}},应绑定到两个myCollection
s CollectionViewSource
和AllItems
。
SelectedItems
的源属性绑定到AllItems
。 myCollection
的源属性应绑定到SelectedItems
的{{1}}项。
myCollection
问题:加载Window时,一切正常。但是,当IsSelected == 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);
值发生变化时,它显然对IsSelected
没有影响。因此,为了解决这个问题,我每次更改myCollection
属性时都会更新SelectedItems
的源属性。
问题:如何进行这类绑定,以便无需手动更新SelectedItems
的源属性?
Thnaks。
答案 0 :(得分:1)
MyClass
中的更改后,您应该提出PropertyChanged Event
。
如果您已经这样做,那么您应该在调试模式下查看SelectedItems.Source
。也许它已经存在正确的值,但它没有显示给你。
我的意思是如果SelectedItems.Source
属于某些可见元素 - GUI - 您应该在屏幕上刷新它。导致该值存在另一种方式,但直到屏幕上的元素重新绘制才会显示。
答案 1 :(得分:1)
首先,您应该无条件地删除手动过滤设置,并将其替换为更合适的设置。替换内容的选择主要取决于您所针对的.NET版本。
如果定位.NET 4.5,那么一个简单的解决方案就是在集合视图上启用live filtering。
对于早期版本的.NET,无论如何都必须进行一些手动工作,但最好只在重新绑定控件的集合视图上调用Refresh
。为此,您应该通过从XAML设置Filter
事件处理程序将过滤推迟到集合视图本身。