c# - 在 MVVM 中绑定(bind) ItemsControl 的最佳实践

标签 c# wpf mvvm

使用 MVVM 模式时,将项目列表绑定(bind)到 ItemsControl 的最佳实践是什么?

1.绑定(bind)一个ViewModel列表

从数据库加载项目,创建模型和所有 View 模型,然后将 View 模型列表绑定(bind)到 ItemsControl.ItemsSource:

public class MyMainViewModel
{
    public List<PersonViewModel> Persons { get; set; }
}

2.绑定(bind)模型列表

从数据库加载项目,创建模型,然后将这些模型的列表直接绑定(bind)到 ItemsControl.ItemsSource:
public class MyMainViewModel
{
    public List<Person> Persons { get; set; }
}

最佳答案

我认为这里的答案真的取决于。

首先,您需要评估您的 View 是否需要以这样一种方式与您的模型交互,以便将 View 模型包裹在特定模型周围是有意义的。让我们看一个例子:

public class WebsiteModel
{
    public string URL { get; set; }
}

这里我有一个非常简单的模型,它代表一个网站,没什么花哨的。我可以创建一个包含所有网站的 View 模型,例如一对多关系:
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)
    {  
       ...
}

在这里我希望我的 View 能够导航 使用浏览器访问 URL。我的 View 模型包含一个模型列表,我的命令负责导航。

下一个方法我可以创建一个 View 模型来表示 模型,我会说这是一种可靠的方法:
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()
    {  
       ...
}

在这种情况下,我需要另一个 View 模型,它将公开 WebsiteViewModel 的列表。在我看来。
public List<WebsiteViewModel> Websites { get; set; }

事实是没有真正的最佳实践。两种方法都没有真正胜过另一种方法。每种方法都有好处,但是选择的方法实际上取决于实现。在这种情况下,我会说方法 2 过于复杂。然而, View 模型很快变得非常大的情况并不少见,分离关注点的需要将迫使您创建更小的类,甚至 View 模型将您的模型包装在其中,使方法 2 成为可行的选择。

所以总结一下。这两种方法都不是最佳实践。

关于c# - 在 MVVM 中绑定(bind) ItemsControl 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33488059/

相关文章:

c# - 我无法获取自定义控件的选定项

c# - Entity Framework - 为什么这行得通?

wpf - 如何了解 Canvas.Children 中对象的类型

android - 在 ViewModel 中观察 LiveData 最佳实践

c# - Google 趋势 - 5 次调用后达到配额限制

c# - 通过 ping 或 socket 检查代理有什么区别?

c# - 应用程序查询时 Azure 移动服务字符串/日期列出现问题

c# - 最佳实践是使用模型还是简单属性?

silverlight-4.0 - MVVM Light Toolkit设计方法(导航和 View 加载)

c# - 将 C# 数组与自身进行比较