如何在ViewModel中公开Model的集合

时间:2011-08-09 15:14:48

标签: c# wpf mvvm

我正在为表示递归嵌套类型的类实现MVVM。例如:

class NestedType
{
    // Other properties here

    public Collection<NestedType> SubElements {get; set;}
}

class NestedTypeViewModel
{
    ObservableCollection<NestedType> ModelCollection { ??? }
}

如何以可观察的方式公开模型集合中的项目? (即,视图将添加,创建和修改子元素)我假设我需要ViewModel中的集合为ObservableCollection<T>但是在模型中呢?我也可以将其设为ObservableCollection并直接暴露它......

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以直接从模型中返回ObservableList。 WPF将获取Collection的引用并注册到模型集合的CollectionChanged事件。

class MyViewModel
{
  public ObservableCollection<NestedType> MyItems { return Model.Items; }
} 

但是,你将通过使用MVVM打破你想要实现的目标。 ViewModel不应公开模型,单个或集合,否则您的视图可能绑定到您不应该在MVVM中执行的模型。

MVVM不是宗教,每个人都以不同的方式实现某些部分。如果这对您来说没问题......请直接进行。

如果您想要一个干净的解决方案,您可以从这里获得多个选项。只允许管理员修改模型的集合并创建相应的视图模型或者我的最喜欢的方法是通过在新的视图模型中自动包装新添加的模型并将此vm添加到其中来使对象同步模型和视图模型集合。父视图模型列表。

答案 1 :(得分:0)

只要您不需要将Model传递给Models,您就可以在没有单独的ViewModel实体的情况下生活,因此您可以坚持ViewModel代表实际的Model数据。

我建议使用引擎盖下的私有字段以及INotifyPropertyChanged

来公开它
class NestedTypeViewModel 
{     
    private ObservableCollection<NestedType> dataItems; 

    public ObservableCollection<NestedType> DataItems
    {
       get
       { 
          return this.dataItems;
       }
       private set
       {
           this.dataItems = value;
           // here is should be OnPropertyChanged("DataItems") call
       }
    } 
} 

编辑:回复评论

但是如果你已经拥有像Model这样的实体 - 那么尝试通过接口注入ViewModel,这样Model和ViewModel至少会被解耦