モデルをビューに直接バインドすることは、モデルが INotifyPropertyChanged インターフェイスを実装している場合にのみ機能します。(例: Entity Framework によって生成されたモデル)
モデル実装 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パターン(パターン!=ルール)を壊すことはありません。
もう1つ..ViewModelはModelに依存しています。モデルが外部サービス/環境によって変更できる場合。物事を複雑にしているのは「グローバルな状態」です。