gpt4 book ai didi

C# MVVM : Adding new ViewModel (strict non-exposed Model design)

转载 作者:行者123 更新时间:2023-11-30 12:12:08 24 4
gpt4 key购买 nike

我一直在使用 C# 开发 MVVM 应用程序,但在处理我的 View 摘要中的 ViewModel 集合时始终遇到一些问题。具体来说,它们都倾向于将模型作为 ViewModel 的私有(private)成员的问题。

这方面的一个例子是创建新的 ViewModel(根据 View 的请求)。对于一些序言(虽然你可能不需要这些来帮助我)这里有示例模型和 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 的公共(public)成员。 MainWindowViewModel 处理模型的集合(私有(private)的, View 看不到这些)和 View 模型( View 消化的公共(public)):

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?我的 View 中的方法是否会创建一个新的 ViewModel 并填充它?作为一个纯粹主义者,我假设根本不应该允许 View 创建或填充模型。我的 ViewModel 是否应该包含一个不接受任何东西(即不接受底层模型)的构造函数,而是创建一个空白来填充?

“纯”MVVM 方法不断出现此类问题。我必须在我的 ViewModel (bool compare(Model model)) 中创建一个公共(public)方法,它将模型(准备删除等)与其内部模型进行比较。如果模型公开(破坏纯度),那么查找与模型相关联的 ViewModel 之类的事情就会容易得多。

最佳答案

我可以理解其中的一些问题。我最近写了一个 MVVM 应用程序,经常出现类似的问题。技巧之一是明确地决定哪个类将负责 Model 实例。你想让它成为你的 MainWindowViewModel 吗?或者你的 NameViewModel?您不想在这两个类之间分担创建/删除模型的责任;你将有一场相当大的后勤噩梦。

其次,即使是“纯”MVVM 方法也并不规定您不能公开模型。您自己说过,这样做会让您省去很多麻烦:DO IT。 MVVM 只规定 ViewModel 不知道/访问 View。有许多“官方”MVVM 示例甚至使用 INotifyPropertyChanged 接口(interface)实现其模型,并直接绑定(bind)到模型上的属性。

就我个人而言,我认为我会将 NameModel 的控制权交给 NameViewModel。这意味着您应该从 MainWindowViewModel 中完全删除 NameModels 列表。如果你想给 NameViewModel 一个可选的构造函数,它接受一个模型,那也很好。

我很喜欢这种方法:

public NameViewModel : ViewModelBase
{
public NameModel Model
{
get { /* get stuff */ }
set { /* set stuff */ }
}

// Default constructor creates its own new NameModel
public NameViewModel()
{
this.Model = new NameModel();
}

// Constructor has a specific model dictated to it
public NameViewModel(NameModel model)
{
this.Model = model;
}

//Model wrapper properties
public String Name
{
get { return Model.Name; }
set { Model.Name = value; }
}
}

和...

public class MainWindowViewModel
{
Private ObservableCollection<ViewModel> _NameViewModels;

Public Void MainWindowViewModel()
{
//Lets pretend we have a service that returns a list of models
var nameModels = Service.Request();
foreach(Model model in nameModels)
{
ViewModel viewmodel = new NameViewModel(model);
NameViewModel.Add(viewmodel);
}
}

Public ObservableCollection<ViewModel> NameViewModels
{
get
{
return _NameViewModels;
}
}
}

通过这种方式,您的 MainWindowViewModel 不会保留一个完全独立的模型副本;它只跟踪 NameViewModels。每个 NameViewModel 负责其自己的基础模型,同时仍然提供选项以在构造期间将特定模型传递给它。

关于C# MVVM : Adding new ViewModel (strict non-exposed Model design),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14082006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com