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属性吗?还是我错过了什么?
DataItem
在这种情况下简单地表示Model
。如果Model
是一个无法修改的实体(数据库自动生成的POCO),则此场景将起作用。
是的,您必须在ViewModel
中拥有每个适用的Model
属性,这样它才能RaisePropertyChanged。是的,这是更多的"工作",但它提供了两者之间的抽象。
有些人可以修改Model
使其实现INotiftyPropertyChanged
,另一些人则认为Model
不应该,所有的工作都应该在ViewModel
中完成(在这种情况下就是这样)。