【问题标题】:Query ObservableCollection with Linq MVVM使用 Linq MVVM 查询 ObservableCollection
【发布时间】:2016-05-23 13:29:40
【问题描述】:

我想在我的 ObservableCollection 上使用 linq 创建一个查询,但 T 的尝试方式并没有真正奏效。

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

所以我想在我的条目 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; }
    }

但你可能猜到这行不通。

问候

【问题讨论】:

    标签: c# wpf linq mvvm


    【解决方案1】:

    试试

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

    【讨论】:

    • 我认为您缺少选择语句
    • @FelixCastor - 我不认为这是必要的,因为我没有将值(即注释)投射到不同的形式中
    • 感谢您的回复,但它不起作用。是不是和我的查询一样,只是一个简短的形式?
    • 或者只是不创建list变量return new ObservableCollection&lt;Note&gt;(_entries.Where(e=&gt;e.isActive).ToList()) ;
    • @Sens4 你能提供更多细节吗?
    【解决方案2】:

    与其在 get 中编辑它,不如尝试在 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");
    });
    

    【讨论】:

    • 非常感谢它的工作原理。正如您提到的,refinedEntries 的更新不起作用。那么我是否正确我必须以某种方式通知视图,该视图在 entries setter 内发生了变化?但是如果我应该怎么办?
    • 是的,你应该已经实现了INotifyPropertyChanged接口并设置了你的wpf组件的datacontext。
    • 我昨天刚刚写了一个例子example
    • 是的,我的模型继承了它。您的 collectionchanged 事件示例无法正常工作。我已将它放入我的模型构造函数中,但仍未更新 :(
    • 你是在调用OnPropertyChanged()方法通知UI吗?
    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多