2010-12-06 11 views
2

MVVMを初めて使用しています。 MVVMを実装する際に間違いがある場合は、私に修正してください。モデルからViewModelと通信する方法

私のModelクラスにはPriceとIsCheckedという2つのプロパティがあります。私のViewModelクラスで

public int Price { get; set; } 
    public static int _total; 

    bool _isChecked; 
    public bool IsChecked 
    { 

     get 
     { 
      return _isChecked; 

     } 
     set 
     { 
      _isChecked = value; 

      if (value == true) 
      { 
       _total+= this.Price; 
      } 
      else 
      { 
       _total-= this.Price; 
      } 


     } 
    } 

そこタイプリストのプロパティが<モデル>があり、それはビューのデータグリッドにバインドし、別のプロパティがビュー内のTextBlockに囲まれた合計、です。

public int Total 
    { 
     get 
     { 
      return DocumentStoreModel._total; 

     } 
     set 
     { 

     } 

    } 

DataGridがチェックボックスの列を持っており、ユーザーは、その後、合計が表示に反映されるべきDataGrid内のチェックボックスの列からのチェックボックスをオンにした場合には、

<DG:DataGridCheckBoxColumn Header="Select" Binding="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></DG:DataGridCheckBoxColumn> 

今すぐにisCheckedプロパティで囲まれています。

私のViewModelクラスは、INotifyPropertyChangedインターフェイスを実装しています。

私のモデルのプロパティがどのように私のviewModelに伝えることができますか?

どうすればいいですか?

答えて

0

ViewModelにモデルを公開する場合は、モデルにINotifyPropertyChangedを実装する必要があります。しかし、あなたはTotalプロパティが静的であり、静的プロパティにはINotifyPropertyChangedを使用できないという問題があります。 ViewModelで購読可能なカスタムイベントをモデルに作成することをお勧めします。ここに例があります(ちょっと整理したいかもしれません)。

public class Model : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    internal static event EventHandler TotalChanged; 
    internal static int Total { get; private set;} 

    private int price; 
    public int Price 
    { 
     get { return price; } 
     set 
     { 
      price = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Price")); 
     } 
    } 

    private bool isChecked; 
    public bool IsChecked 
    { 
     get { return isChecked; } 
     set 
     { isChecked = value; 
      if (value) 
       Total += Price; 
      else 
       Total -= Price; 
      if (TotalChanged != null) 
       TotalChanged(this, EventArgs.Empty); 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("IsChecked")); 
     } 
    } 
} 

public class MainViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public int Total 
    { 
     get { return Model.Total; } 
    } 

    public MainViewModel() 
    { 
     Model.TotalChanged += TotalChanged; 
    } 

    private void TotalChanged(object sender, EventArgs e) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("Total")); 
    } 
} 
+0

ありがとう、私は同じapprochを使用しました。私はデリゲートを使ったイベントを使用する代わりに違いのみでした。私はこのapprochがMVVMによるかどうか、私がqusに尋ねた理由はわかりませんでした。ありがとう。 –

0

あなたは(それのICommandまたは変種を実装することにより)Commandを実装し、ビューモデルに財産とチェックボックスでイベントのためのビューにバインドそれをとして公開する必要があります。

2

あなたのViewModelのTotalプロパティは、モデルのTotalプロパティを指しているので、モデルの合計に対する変更は、ViewModelでも同様に変更されます。

IsCheckedが変更されたときに、ViewModelのTotalプロパティのPropertyChangedイベントを発生させることがあります。これにより、ビューには、合計テキストブロックのデータが更新されます。

関連する問題