我想知道在视图模型中使用模型类的正确方法。作为MVVM,我使用Caliburn Micro。
第一种选择。
模特课:
public class CurrentUser : IDataErrorInfo
{
public string Nick { get; set; }
public string Password { get; set; }
//...
}
在视图模型类中使用模型:
[Export(typeof(ILogOnViewModel))]
public class LogOnViewModel : Screen
{
public CurrentUser CurrentUser { get; set; }
//bind on control in view
public string CurrentNick
{
get { return CurrentUser.Nick; }
set
{
CurrentUser.Nick = value;
NotifyOfPropertyChange(() => CurrentNick);
}
}
//bind on control in view
public string CurrentPassword
{
get { return CurrentUser.Password; }
set
{
CurrentUser.Password = value;
NotifyOfPropertyChange(() => CurrentPassword);
}
}
}
第二种选择:
模特课:
public class CurrentUser : IDataErrorInfo, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string Nick
{
get { return _nick; }
set
{
_nick = value;
NotifyPropertyChanged("Nick");
}
}
public string Password
{
get { return _password; }
set
{
_password = value;
NotifyPropertyChanged("Password");
}
}
//...
}
在视图模型类中使用模型类:
[Export(typeof(ILogOnViewModel))]
public class LogOnViewModel : Screen
{
//bind on UI control
public CurrentUser CurrentUser { get; set; }
}
答案 0 :(得分:5)
第一种选择会更好,因为它可以更好地从View中封装你的模型
但是您应该在 ViewModel 上实现IDataErrorInfo
和INotifyPropertyChanged
,因为ViewModel应该是通知您的用户界面更改和错误的对象。
答案 1 :(得分:5)
我更喜欢第一种方法。原因如下:
Model
永远无法访问View
。ViewModel
包装/展示了从View
绑定到Model
所需的所有属性。它添加了促进View
功能所需的任何其他属性,集合和命令,同时防止将代码放入代码中。IDataErrorInfo
和INotifyPropertyChanged
便于View
而非ViewModel
。由于View
仅与ViewModel
进行通信,因此它们应位于ViewModel
内。答案 2 :(得分:1)
我会使用第二方法。如果您正在寻找使用第二种方法的示例应用程序,那么您可能会发现 WPF Application Framework (WAF) 项目很有趣。
答案 3 :(得分:0)
我建议从第二种方法开始。它可以避免输入大量重复的桥接属性。如果遇到需要包装在View Model上的属性,则对该属性执行此操作,然后更新View的绑定。您的模型和视图模型都可以实现IDataErrorInfo和INotifyPropertyChanged。当模型中的某些逻辑更改属性时,后者非常有用,因为它将传播到View。通过基类实现这些接口,你可以同时拥有ModelBase和ViewModelBase抽象类,后者来自前者。