2016-10-29 1 views
0

ObservibaleCollection<MyObj>に含まれるクラスのコレクションがあり、MyObjにはINotifyPropertyChangedが実装されていますが、linq経由でコレクション内のプロパティを参照する独自のコレクションを作成するプロパティが必要ですコレクションの変更と、そのコンテンツのlinqバインドされたプロパティのいずれかを更新して更新します。Linot経由でそれを参照するプロパティを更新する

私のクラスMyObjにはIsVisibleというプロパティが含まれています。私は独自のINotifyPropertyChangedを実装しているプロパティで、IsVisible == trueのMyObjのリストを取得し、MyObjのコレクションが変更されているかIsVisibleプロパティがidに関係なく最新の状態に保たれるようにします。

は、それぞれの子MyObj.IsVisibleプロパティに取り付け、その後、単に直接収集変わったイベントにアタッチとすることなく、このことは可能ですか? linotを通してINotifyをバブルアップさせる方法はありますか?

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

私は頼んでいることを意味します。

答えて

1

あなたは反応性拡張機能を利用することができますが、この特定の要件のために - myVisibleObjsを維持する - 私はdynamic dataのlibを使用します。

は、以下のことを試してみてください:

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の変更として更新される新しいコレクションにフィルタに観察チェンジセットを結合することです。私が探しています正確に何がある可能性がありますが、 `ReactiveUI`、` BLinq`、 `CLinq`などが含まれない

+1

その他のライブラリ... – Aron

+0

! – Wobbles

関連する問題