MVVM中绑定项目控制的最佳实践
本文关键字:最佳 控制 绑定 项目 MVVM | 更新日期: 2023-09-27 18:20:13
使用MVVM模式时,将项目列表绑定到ItemsControl的最佳实践是什么?
1.绑定ViewModels列表
从数据库加载项目,创建模型和所有视图模型,然后将视图模型列表绑定到ItemsControl.ItemsSource:
public class MyMainViewModel
{
public List<PersonViewModel> Persons { get; set; }
}
2.绑定模型列表
从数据库加载项目,创建模型,然后将这些模型的列表直接绑定到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成为一个可行的选择。
结束吧。这两种方法都不是最佳实践。
唯一"正确"的方法是始终使用ViewModels。
虽然最初需要做更多的工作,但它给了你更多的灵活性和更少的错误
不要以为get,当你的模型应该只在它的有界上下文中有效,而当你将ViewModel绑定到视图时,你就有了一个泄漏的抽象。视图会意识到模型,对模型的每次更改都会影响视图。
此外,重构在XAML中不起作用。因此,如果通过重构命名模型属性,XAML仍将绑定到旧属性。这不会给您带来编译错误,并且您的有界元素将保持为空(在最佳情况下)或崩溃(在最坏情况下)。
这可能很难理解和解决。正如Scroog1所评论的,它引入了内存泄漏。在小型应用程序中可能不明显,但在处理大数据集的应用程序中,这可能会导致内存不足的异常。
在允许的情况下,您应该使用自动映射库从Model映射到ViewModel,这将减少一些样板代码。但请记住避免ViewModel到Model的自动映射,因为这是不鼓励的。
您希望避免模型中的更改影响不同有界上下文中的代码,即您不希望在rest服务中公开每个数据库或模型更改,即使更改不会影响给定的rest操作。
相同的策略可以应用于n层模型(视图、视图模型、(域)模型层、服务和基础设施)
我认为没有正确的方法,使用模型是实用且更简单的方法,而使用视图模型更耗时但更解耦。。。
你应该看看这篇文章:http://blog.alner.net/archive/2010/02/09/mvvm-to-wrap-or-not-to-wrap.aspx
此外:http://www.codeproject.com/Articles/61147/MVVM-Creating-ViewModel-Wrap-your-business-object