2016-05-23 7 views
1

ObservableCollectionでlinqを使用してクエリを作成したいのですが、Tがどのように試したかは実際には動作しません。Linq MVVMを使用してObservableCollectionを照会します

私は、パラメータとして{note, information, isActive}を持つモデルEntryを持っています。ですから、isActiveが真であるところのEntriesをすべて取得するだけです。私はプログラムにすべてのエントリをロードする必要があるので、私のdataprovider(データがロードされると)には使用しません。

だから私は私のObservableCollectionエントリ内のゲッターを上書きしようと考えた:

public ObservableCollection<Note> _entries { get; set; } 
    public ObservableCollection<Note> entries 
    { 
     get 
     { 
      return new ObservableCollection<Note>(from entry in this._entries 
                where entry.isActive == true 
                select entry); 
     } 
     set { this._entries = value; } 
    } 

しかし、あなたは、これは動作しません想像通り。

よろしく

答えて

1

を試してみて、entries「セッターでrefinedEntriesを更新してみてください。私のLinqステートメントは動作する必要がありますが、私が提案しようとしているものをカプセル化しています。

は基本的にも、エントリで非アクティブレコードとのみアクティブレコードを格納するための別のコレクションのすべてのコピーを保持します。この場合、私はそれをrefinedEntriesと呼んでいます。

private ObservableCollection<Note> _entries; 

    public ObservableCollection<Note> entries 
    { 
     get{return _entries;} 
     set 
     { 
     _entries = value; 
     RefinedEntries = new ObservableCollection(_entries.Where(e=>e.isActive).Select(e => e)); 
     } 

    } 

    public ObservableCollection<Note> refinedEntries {get;set;} 

私もときCollectionChangedEvent火災refinedEntriesを更新することをお勧め。この場合、refinedEntriesが更新されるのは、entriesが新しいインスタンスに設定されている場合のみです。

あなたはエントリーのための新しいコレクションをインスタンス化

は、その CollectionChangedEventに加入します。あなたがモデルのコンストラクタでコレクションをインスタンス化している場合たとえば、次のように使用することができます。..

entries = new ObservableCollection<Note>(); 
entries.CollectionChangedEvent += new NotifyCollectionChangedEventHandler((sender,args) => 
{ 
    RefinedEntries = new ObservableCollection(_entries.Where(e=>e.isActive).Select(e => e)); 
    //Notify the UI that an update has been made. 
    OnPropertyChanged("RefinedEntries"); 
}); 
+0

大変感謝しています。あなたがrefinedEntriesのアップデートは動作しないと述べました。ですから、refinedCollectionが 'entries setter'の内部で変更されたことを何らかの形でビューに通知しなければならないということを正解していますか?しかし、どうすればいいのですか? – Sens4

+0

はい、あなたは[ 'INotifyPropertyChanged'](https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(V = vs.110).aspxの)インターフェースを実装してのDataContextのを設定しておく必要がありますあなたのwpfコンポーネント。 –

+0

私はちょうどこの昨日の例を書いた[例](http://stackoverflow.com/questions/37362216/c-sharp-wpf-binding-doesnt-take-data-from-property/37362721#37362721) –

2

GETでそれを編集するのではなく

 get 
     { 
      List<Notes> list = _entries.Where(e=>e.isActive).ToList(); 
      return new ObservableCollection<Note>(list) ; 
     } 
+0

私はあなたがselect文に –

+0

@FelixCastorが欠けていると思う - 私は、突出ないよので、それが必要だとは思いません値(すなわち、注釈)を別のフォームに入力してください – auburg

+0

あなたの応答に感謝しますが、動作しません。それは私のクエリと同じではなく、ちょうど短い形式ですか? – Sens4

関連する問題