2010-12-06 34 views
2

我剛剛退出MVVM。所以如果我在實現MVVM時犯了錯誤,請糾正我。如何與Model Model中的ViewModel進行通信

在我的Model類中有兩個屬性Price和IsChecked。

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; 
      } 


     } 
    } 

在我的ViewModel類有類型列表的屬性<型號>,它爲界在以DataGrid和他人財產是共有,其界定在查看一個文本塊。

public int Total 
    { 
     get 
     { 
      return DocumentStoreModel._total; 

     } 
     set 
     { 

     } 

    } 

數據網格都有一個複選框列,它與物業器isChecked界現在

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

,如果用戶檢查從複選框列在DataGrid中的複選框,然後總要在視圖中反映出來。

我的ViewModel類正在實現INotifyPropertyChanged接口。

我的遺物是,如果我的模型的屬性正在改變,我可以告訴它我的viewModel?

請讓我知道我怎麼能做到這一點。

回答

0

由於您在ViewModel範圍內暴露您的模型,因此您需要在模型中實施INotifyPropertyChanged。然而,你的問題在於你的Total屬性是靜態的,並且(afaik)你不能使用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

謝謝院長,我用同樣的方法。唯一的區別是不是使用我使用委託的事件。我不確定這個接近是否依據MVVM,這就是爲什麼我問這個問題。謝謝。 – 2010-12-07 06:39:48

0

您需要實現Command(通過實現它ICommand或變體)並暴露作爲視圖模型財產綁定它的上的複選框事件的看法。

2

從我可以告訴您的ViewModel的Total屬性指向您的Model的Total屬性,因此您對Model的總數所做的任何更改也將基本上針對ViewModel進行更改。

但是,IsChecked更改後,您可能需要做的事情是在ViewModel上提升Total屬性的PropertyChanged事件。這將告訴您的視圖更新您的文本塊的數據。