inotifyproperty通过Linq更新引用它的属性
本文关键字:属性 引用 更新 通过 Linq inotifyproperty | 更新日期: 2023-09-27 18:15:33
我有一个包含在ObservibaleCollection<MyObj>
和MyObj实现INotifyPropertyChanged
的类集合,但我需要一个位于它之外的属性,通过linq引用集合中的属性,并创建自己的集合,以更新集合更改和任何内容linq绑定属性更改。
为了论证和简单,我们假设我的类MyObj
包含一个名为IsVisible
的属性。我想要一个实现自己的INotifyPropertyChanged的属性,以获得MyObj的列表,其中IsVisible == true,并保持它最新,无论MyObj的集合更改或IsVisible属性。
这是否可能不附加到集合更改事件,然后直接附加到每个子MyObj。IsVisible财产吗?有没有一种方法可以让INotify通过linq冒泡?
public class MyObj:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public bool IsVisible
{
get { return _IsVisible; }
protected set { if (value != _IsVisible) { _IsVisible= value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsVisible")); } }
}
private bool _IsVisible;
}
public class Foo
{
ObservableCollection<MyObj> myObjs = new ObservableCollection<MyObj>();
ObservableCollection<MyObj> myVisibleObjs {
get{
return myObjs.where(o => o.IsVisible);
}
}
}
我希望我问的是有意义的。
您可以使用响应式扩展,但是对于这个特定的需求-维护myVisibleObjs -我将使用动态数据库。
试一下:
static void Main(string[] args)
{
Foo f = new Foo();
f.BindToVisibleObjects();
// add more dummy data
f.Add(false);
f.Add(true);
// There will be 2 visible objects in MyVisibleObjects
foreach (var d in f.MyVisibleObjects)
{
Console.WriteLine(d.IsVisible);
}
Console.ReadKey();
}
public class Foo
{
ObservableCollection<MyObj> myObjs = new ObservableCollection<MyObj>();
public ReadOnlyObservableCollection<MyObj> MyVisibleObjects;
public Foo()
{
// add some dummy data
myObjs.Add(new MyObj() { IsVisible = true });
myObjs.Add(new MyObj() { IsVisible = false });
}
public void BindToVisibleObjects()
{
myObjs.ToObservableChangeSet()
.Filter(o => o.IsVisible)
.Bind(out MyVisibleObjects)
.DisposeMany()
.Subscribe();
}
public void Add(bool vis)
{
myObjs.Add(new MyObj() { IsVisible = vis });
}
}