【问题标题】:What is the purpose of DataItem in the MVVM light sample code? Why is it implemented like this?MVVM light 示例代码中 DataItem 的用途是什么?为什么要这样实现?
【发布时间】:2016-11-25 01:28:27
【问题描述】:

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

DataItem.cs:

public class DataItem
{
    public string Title { get; private set; }

    public DataItem(string title)
    {
        Title = title;
    }
}

这个类声明了 ViewModel 中需要的一组属性。用于Model层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);
    }
}

我认为它也可以在 VM 中用于保存属性,如下所示:

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 实现对象,因此它使用更少的资源。但是,如果我必须为 VM 实现大量属性,我将不得不在 VM 和 DataItem 上编写属性,而且当我想要添加或删除属性时,我必须同时编辑它们。

我不能只在 VM 中保存一个 DataItem 属性吗?还是我错过了什么?

【问题讨论】:

  • “我不能只在 VM 中保存一个 DataItem 属性吗?”当然可以,但是这里的模型属性不会引发 PropertyChanged 事件,因为 DataItem 没有实现 INotifyPropertyChanged。所以你仍然需要每个属性的包装器。但是,如果在更新时 DataItem 实例被一个新实例替换,那就没有必要了。
  • 大约有 20 个“我的视图模型 HERP 需要来自视图模型 DERP 的属性 X 的值 A。我如何获得它?”每周在 MVVM 标签中提问。简单的答案是 HERP 必须引用 DERP。但人们往往无法弄清楚如何将它们连接在一起。因此,一些框架提供了视图模型之间的通用通信方式。这是通用通信方式的示例。

标签: c# wpf mvvm data-binding mvvm-light


【解决方案1】:

DataItem 在这种情况下仅代表Model。如果Model 是无法修改的实体(数据库自动生成的 POCO),则此方案可以工作。

是的,您必须在您的 ViewModel 中拥有每个适用的 Model 属性,以便它可以 RaisePropertyChanged,是的,这更像是“工作”,但它提供了两者之间的抽象。

有些人可以修改Model 以使其实现INotiftyPropertyChanged,其他人认为Model 不应该,所有工作都应该在ViewModel 中完成(这就是在本例)。

【讨论】:

  • 谢谢我终于明白了!意识到模型的想法在我的脑海中混杂了。
猜你喜欢
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2015-07-07
相关资源
最近更新 更多