【发布时间】: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