MVVM轻量级示例代码中DataItem的用途是什么?为什么它是这样实现的

本文关键字:为什么 实现 是什么 轻量级 代码 MVVM DataItem | 更新日期: 2023-09-27 17:57:58

在创建一个新的MVVM light(WPF451)项目时,我收到了这个示例代码,这让我感到困惑。

DataItem.cs:

public class DataItem
{
    public string Title { get; private set; }
    public DataItem(string title)
    {
        Title = title;
    }
}

此类声明ViewModel中所需的一组属性。它用于模型层DataService,后者在其构造函数中向VM提供数据。

DataService.cs

public class DataService : IDataService
{
    public void GetData(Action<DataItem, Exception> callback)
    {
        // Use this to connect to the actual data service
        var item = new DataItem("Welcome to MVVM Light");
        callback(item, null);
    }
}

我想它也会在虚拟机中用于保存属性,比如:

public DataItem Data { get; set; }

但是MVVM轻型开发人员决定重新声明VM中的属性。

MainViewModel.cs:

public class MainViewModel : ViewModelBase
{
    private readonly IDataService _dataService;
    private string _welcomeTitle = string.Empty;
    public string WelcomeTitle
    {
        get{ return _welcomeTitle; }
        set{ Set(ref _welcomeTitle, value); }
    }
    public MainViewModel(IDataService dataService)
    {
        _dataService = dataService;
        _dataService.GetData(
            (item, error) =>
            {
                WelcomeTitle = item.Title;
            });
    }
}

我不明白他们为什么这样执行。是的,它减少了冗余的INotifyPropertyChanged实现的对象,因此使用的资源更少。然而,如果我必须为虚拟机实现大量的属性,我将不得不在虚拟机和DataItem上写入属性,而且当我想添加或删除属性时,我必须编辑这两个属性。

难道我不能在虚拟机中保留一个DataItem属性吗?还是我错过了什么?

MVVM轻量级示例代码中DataItem的用途是什么?为什么它是这样实现的

DataItem在这种情况下简单地表示Model。如果Model是一个无法修改的实体(数据库自动生成的POCO),则此场景将起作用。

是的,您必须在ViewModel中拥有每个适用的Model属性,这样它才能RaisePropertyChanged。是的,这是更多的"工作",但它提供了两者之间的抽象。

有些人可以修改Model使其实现INotiftyPropertyChanged,另一些人则认为Model不应该,所有的工作都应该在ViewModel中完成(在这种情况下就是这样)。