使用Linq MVVM查询ObservableCollection

时间:2016-05-23 13:29:41

标签: c# wpf linq mvvm

我想在我的ObservableCollection上使用linq创建一个查询,但它并没有真正起作用T的尝试。

我有一个模型Entry,其中{note, information, isActive}为参数。所以我现在想简单地得到isActive为真的所有Entries。我没有在我的数据提供者上使用它(一旦数据被加载),因为我需要将每个条目加载到程序中。

所以我想在我的条目ObservableCollection:

中覆盖getter
    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; }
    }

但正如你可能猜到的那样,它不起作用。

此致

2 个答案:

答案 0 :(得分:2)

尝试

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

答案 1 :(得分:1)

尝试更新refinedEntries&#39;中的entries,而不是在get中对其进行编辑。二传手。我的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;}

我还建议在refinedEntries触发时更新CollectionChangedEvent。在这种情况下,唯一的refinedEntries更新时间是entries设置为新实例。

当您为条目实例化新集合时,请订阅其CollectionChangedEvent。例如,如果您在Model的构造函数中实例化集合,则可以使用以下代码。

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