使用MVVM模式时,将项目列表绑定到ItemsControl的最佳实践是什么?
从数据库中加载项目,创建模型和所有视图模型,然后将视图模型列表绑定到ItemsControl.ItemsSource:
public class MyMainViewModel
{
public List<PersonViewModel> Persons { get; set; }
}
从数据库加载项目,创建模型,然后将这些模型的列表直接绑定到ItemsControl.ItemsSource:
public class MyMainViewModel
{
public List<Person> Persons { get; set; }
}
我认为这里的答案确实取决于情况。
首先,您需要评估视图是否需要与模型进行交互,以使将视图模型包装在特定模型周围是有意义的。让我们看一个例子:
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成为可行的选择。
所以总结一下。两种方法都不是最佳实践。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句