我认为这里的答案真的是这取决于。
首先,您需要评估您的视图是否需要与您的模型进行交互,以便将视图模型包裹特定型号。我们来看一个例子:
public class WebsiteModel
{
public string URL { get; set; }
}
这里我有一个非常简单的模型,它代表一个网站,没什么花哨的。我可以创建一个包含所有网站的视图模型,例如一对多关系:
public class WebsitesViewModel
{
//A list of websites.
public List<WebsiteModel> Websites { get; set; }
//The command I will use to navigate, where the object parameter will be the WebsiteModel.
public ICommand NavigateCommand { get; set; }
...
public void Navigate(WebsiteModel model)
{
...
}
在这里,我希望我的视图能够使用浏览器导航到 URL。我的视图模型包含一个模型列表,我的命令负责导航。
我可以创建一个视图模型来表示单个模型的下一个方法,我会说这是一种 SOLID 方法:
public class WebsiteViewModel
{
//The website model
public WebsiteModel Website { get; set; }
//The command I will use to navigate, no parameters needed.
public ICommand NavigateCommand { get; set; }
...
public void Navigate()
{
...
}
在这种情况下,我需要另一个视图模型,它将WebsiteViewModel 列表公开给我的视图。
public List<WebsiteViewModel> Websites { get; set; }
事实上并没有真正的最佳实践。两种方法都没有真正胜过另一种方法。每种方法都有好处,但是选择的方法实际上取决于实现。在这种情况下,我会说方法 2 过于复杂。然而,视图模型很快变得非常大的情况并不少见,分离关注点的需要将迫使您创建更小的类,甚至视图模型将您的模型包装在其中,使方法 2 成为可行的选择。
所以总结一下。这两种方法都不是最佳实践。