我一直在使用C#开发MVVM应用程序,但是在处理View消化的ViewModel集合时,经常遇到一些问题。具体而言,它们都与Model作为ViewModel的私有成员的问题有关。
其中一个例子是创建新的ViewModel(由View请求)。以下是示例Model和ViewModel类的前置说明(尽管您可能不需要这些来帮助我):
Private Class Model()
{
public string Name { get; set; }
}
Public Class ViewModel()
{
Private Model _Model;
Public Void ViewModel(Model model)
{
_Model = model;
}
Public String Name
{
get
{
return _Model.Name;
}
set
{
_Model.Name = value;
}
}
}
整个模型从未直接作为ViewModel的公共成员暴露。 MainWindowViewModel 处理 Model 的集合(私有,视图看不到这些)和 ViewModel 的集合(公共,供视图消化):
Public Class MainWindowViewModel
{
Private List<Model> _NamesModel;
Private ObservableCollection<ViewModel> _NamesViewModel;
Public Void MainWindowViewModel()
{
//Lets pretend we have a service that returns a list of models
_NamesModel = Service.Request();
foreach(Model model in _NamesModel)
{
ViewModel viewmodel = new ViewModel(model);
_NamesViewModel.Add(viewmodel);
}
}
Public ObservableCollection<ViewModel> NamesViewModel
{
get
{
return _NamesViewModel;
}
}
}
现在这是前言,但我有一个问题。如何添加新的ViewModel?我的视图中的方法是否会创建一个新的ViewModel并填充它?作为一个纯粹主义者,我认为View不应该被允许创建或填充Model。我的ViewModel是否应该包含一个不接受任何参数(即没有基础模型)的构造函数,而是创建一个空白以填充?
这些问题在“纯”MVVM方法中一直存在。我不得不在我的ViewModel中创建一个公共方法(bool compare(Model model)),该方法将比较一个模型(准备删除等)与其内部模型。如果模型是公开的(破坏了纯度),那么像查找与模型连接的ViewModel这样的事情就容易多了。