集合的MVVM

CAA*_*CAA 5 wpf mvvm

我最近开始学习wpf并尝试使用mvvm.

我的理解是,在mvvm中,视图或模型都不应该知道另一个存在.

我要做的是在屏幕上显示客户列表.但是如果我对viewModel进行编码,如下所示.这与我在网上看到的许多例子类似,然后我最终得到了一些看起来像这样的代码

class Customer 
{    
    public String Name {get;set;}     
    public String Address {get;set;} }
}

class MainWindowViewModel
{
    ObservableCollection<Customer> customers = new ObservableCollection<Customer>();

    public ObservableCollection<Customer> Customer 
    {
      get {return customers;}
    } 

    public MainWindowViewModel() 
    {
     //cust1 and cust2 are Customer objets
      customers.Add(cust1);
      customers.Add(cust2);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我创建一个MainWindowViewModel的实例并将其设置为我的MainWindowView(我的视图)的datacontext,并且我进一步将viewmodels Customers属性绑定到listBox,那么视图将需要对包含我的Models的程序集的引用.

所以我的问题是.

1)在MVVM中添加对允许的模型程序集的引用,因为这意味着视图知道模型.

2)更好的解决方案是将每个Customer对象包装在CustomerViewModel中,并让MainWindowViewModel包含CustomerViewModelObservableCollection而不是CustomerObservableCollection.这会将模型与视图完全分开.

dev*_*tal 3

  1. 我不确定为什么您认为包含您的视图的项目需要引用您的模型项目?您的视图中没有任何内容直接引用您的模型 - XAML 中的绑定表达式仅按名称链接,并且无论如何都链接到视图模型上的属性,而不是您的模型。
  2. 如果视图需要的数据多于模型提供的数据,并且不希望更改模型,则将模型包装在视图模型中是一个不错的选择。例如,您的视图可能需要显示某种Age类型的User,但User只有一个DateOfBirth属性。如果您不想更改模型,则创建UserViewModel具有属性的模型将是一个不错的选择。Age