【问题标题】:Deal with collections in model in WPF MVVM在 WPF MVVM 中处理模型中的集合
【发布时间】:2013-11-05 14:14:02
【问题描述】:

我已经开始学习 WPF\MVVM 方法并且有点困惑。 我已经:

class ModelAAA {
    public List<Foo> Foos{get; protected set;}
    //..

    public void Boo()
    {
       //Some complex logic updating Foos
    }
}

class ViewModelAAA{

    private ModelAAA _modelAAA

    public ObservableCollection<Foo> Foos{get; protected set;}

    public void ViewModelAAA(ModelAAA modelAAA)
    {
        this._modelAAA = modelAAA;
        this.Foos = new ObservableCollection(modelAAA.Foos)
    }

    public void Boo()
    {
       this._modelAAA.Boo();
       //What should I do here?
    }
}

因此,如果我使用视图模型的Boo 方法,那么在 ViewModel 中更新集合的正确视图是什么。我的想法很少,但它们似乎都很丑陋。我应该每次手动重新创建\更改 viewModel Foos 吗?据我了解,ObservableCollection 不是像对象一样的包装器。

附:我想在模型中使用ObservableCollection 让它变得无懈可击

【问题讨论】:

    标签: c# wpf mvvm observablecollection


    【解决方案1】:

    您的模型不需要使用ObservableCollection,但必须通知您的 ViewModel 集合中的某些内容发生了变化。

    这会创建您的 List 的副本,该副本确实是可观察的,但之后根本不会更改:

    this.Foos = new ObservableCollection(modelAAA.Foos);
    

    我不建议每次 Model-Collection 更改时都创建一个新的 ObservableCollection。而是在 Model-Collection 中实现 INotifyCollectionChanged 并正确处理 Viewmodel 中的事件。

    【讨论】:

      【解决方案2】:

      不,您不需要手动更改它,因为这是ObservableCollection,但是您正在更改原始 集合而不是可观察的集合。

      要通知侦听器您的 Observable,您需要对 Observable 本身采取行动。

      例子:

      public void Boo()
      {
         this.Foos.Boo();
      
      }
      

      【讨论】:

      • 那么,ObservableCollection 是一种包装器?
      • Boo 是模型类的方法,而不是集合的方法。
      • @xander27:我的只是一个例子,给你一个想法。您需要更改 ObservableCollection 和 not 您构建它的集合。
      猜你喜欢
      • 1970-01-01
      • 2011-10-05
      • 2011-04-18
      • 2011-09-26
      • 1970-01-01
      • 2013-07-08
      • 2018-10-25
      • 1970-01-01
      • 2016-12-08
      相关资源
      最近更新 更多