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);
        }
    }
}

我希望我问的是有意义的。

inotifyproperty通过Linq更新引用它的属性

您可以使用响应式扩展,但是对于这个特定的需求-维护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 });
        }
    }
这里的关键是我们将过滤的可观察对象更改集绑定到一个新的集合,该集合将随着myObjs的更改而更新。