2017-03-22 15 views
1

ReactiveUIには、ViewModel(ReactiveObject)の後ろにモデル(INotifyPropertyChanged)がありますが、何がベストプラクティスですか?私は、プロパティのゲッターとセッターでモデルを使用していますか:ViewModelにモデルをバインドする方法

private Model model; 
public string Minky 
{ 
    get { return model.Minky; } 
    set 
    { 
     model.Minky = value; 
     this.PropertyChanged(); 
    } 
} 

または私は個々のプロパティをバインドする必要があります。

private string minky; 
public string Minky 
{ 
    get { return minky; } 
    set { this.RaiseAndSetIfChanged(ref minky, value); } 
} 

public ViewModel(Model model) 
{ 
    if (model != null) 
    { 
    model.WhenAnyValue(x => x.Minky).BindTo(this, x => x.Minky); 
    } 
} 

番目のバージョンは、(私はまだプロパティを設定することができます良いアイデアのように思えますモデルはありません)。これが悪い考えである理由はありますか?

答えて

1

MVVMバインディングパターンのベストプラクティスは、「View」を「ViewModel」にバインドすることです。モデルはここでは使用されません。もちろん、モデルはデータアクセスやビジネスレイヤーで使用され、データベース内のレコードやWebサービスに渡されますが、バインディングには使用されません。

バインディングの理由でカプセル化されたモデルを使用する場合は、独自のPropertyChangedノーティファイヤを使用してモデルをバインド可能なオブジェクトとして作成し、バインドする必要があります。このように:

あなたのViewModelでModel

private Model model; 
public Model Model 
{ 
    get { return model; } 
    set 
    { 
     model = value; 
     this.PropertyChanged(); 
    } 
} 

を持っており、そのようにを要約するプロパティ

this.Bind(ViewModel, x => x.Name, x => x.Model.Minky); 

にバインド:それは悪い考えです。しかし、それを行うには、ViewMdel内のモデルインスタンスに直接バインドします。

+0

ありがとうございます。つまり、ViewModelでViewに関連する特別なフィールドを保持することができますが、モデル – Mitkins

+0

を直接参照することで定型コードを避けることができます。これはWPFやXamarinのような他のすべてのMVVMパターンプラットフォームでも正しい – Emad

関連する問題