仅当模型实现 INotifyPropertyChanged 接口时,绑定模型才能直接查看。(例如,您的模型由实体框架生成)
模型实现 INotifyPropertyChanged
你可以这样做。
public interface IModel : INotifyPropertyChanged //just sample model
{
public string Title { get; set; }
}
public class ViewModel : NotificationObject //prism's ViewModel
{
private IModel model;
//construct
public ViewModel(IModel model)
{
this.model = model;
this.model.PropertyChanged += new PropertyChangedEventHandler(model_PropertyChanged);
}
private void model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Title")
{
//Do something if model has changed by external service.
RaisePropertyChanged(e.PropertyName);
}
}
//....more properties
}
ViewModel 作为 DTO
如果 Model 实现 INotifyPropertyChanged(取决于),在大多数情况下,您可以将其用作 DataContext。但在 DDD 中,大多数 MVVM 模型将被视为 EntityObject 而不是真正的域模型。
更有效的方法是使用 ViewModel 作为 DTO
//Option 1.ViewModel act as DTO / expose some Model's property and responsible for UI logic.
public string Title
{
get
{
// some getter logic
return string.Format("{0}", this.model.Title);
}
set
{
// if(Validate(value)) add some setter logic
this.model.Title = value;
RaisePropertyChanged(() => Title);
}
}
//Option 2.expose the Model (have self validation and implement INotifyPropertyChanged).
public IModel Model
{
get { return this.model; }
set
{
this.model = value;
RaisePropertyChanged(() => Model);
}
}
上面两个 ViewModel 的属性都可以用于绑定,而不会破坏 MVVM 模式(模式!= 规则),这真的取决于。
还有一件事.. ViewModel 依赖于 Model。如果模型可以被外部服务/环境改变。使事情变得复杂的是“全球状态”。