2013-08-07 65 views
0

我目前有一個存儲複選框值的布爾屬性模型。當此值更改(選中/取消選中)時,我想顯示或隱藏文本框。從MVVM Light捕獲RaisePropertyChanged?

現在我的文本框的可見性屬性在我的ViewModel中,而不是在我的模型中。我不知道如何告訴我的Visibility屬性它應該顯示/隱藏,因爲複選框的值已更改。

我知道所有的屬性,我有RaisePropertyChanged,我認爲這將是我可以使用,但我不知道如何捕獲它在我的ViewModel。

還是我接近這一切都錯了?

回答

0

您的ViewModel應該充當您的模型和視圖之間的門戶。它看起來像你的複選框直接綁定到模型。它應該被綁定到相應的視圖模型屬性上,該屬性將作爲您的模型適當值的行爲。例如(免責聲明:我沒有用過MVVM光,但它應該是多數MVVM框架自我解釋):

public class Chobo2 
{ 
    public bool IsChecked {get;set;} 
} 

public class Chobo2ViewModel // Your base class and interfaces 
{ 
    private Chobo2 model; 

    public bool IsChecked 
    { 
     get { return model.IsChecked; } 
     set 
     { 
      if(model.IsChecked == value) return; 

      model.IsChecked = value; 
      RaisePropertyChanged("IsChecked"); 
      RaisePropertyChanged("Visibility"); 
     } 
    } 

    public System.Windows.Visibility Visibility 
    { 
     get 
     { 
      return IsChecked 
         ? System.Windows.Visibility.Visible 
         : System.Windows.Visibility.Collapsed; 
     } 
    } 
} 

如果你的模型本身實現了INotifyPropertyChanged接口,並改變你的視圖模型的邏輯是不是選項(IE的視圖直接綁定到模型的屬性),所有你可以做的就是聽取PropertyChanged事件的變化。

// Assume the Chobo2 class implements INPC 
public class Chobo2ViewModel // Your base class and interfaces 
{ 
    private Chobo2 model; 

    public Chobo2ViewModel(Chobo2 model) 
    { 
     // Should check for null here 
     this.model = model; 
     this.model.PropertyChanged += (sender, args) => 
      { 
       if(args.PropertyName == "IsChecked") 
        RaisePropertyChanged("Visibility") 
      } 
    } 

    public System.Windows.Visibility Visibility 
    { 
     get 
     { 
      return model.IsChecked 
         ? System.Windows.Visibility.Visible 
         : System.Windows.Visibility.Collapsed; 
     } 
    } 
} 
+0

我有點混淆Chobo2模型來自構造函數的地方。我在MVVM Light視頻中看到,我只是看着,是的,你的外觀與視頻顯示的非常相似,但除非我誤解了MVVM燈的創建者喜歡在模型中綁定的內容,以避免重複。你可以在9分鐘左右看到這個視頻http://channel9.msdn.com/events/MIX/MIX11/OPN03。 – chobo2

+0

如果您將視圖直接綁定到模型,您的視圖模型需要訂閱「PropertyChanged」事件(構造函數中的模型是一個人爲的簡短示例)。或者在視圖中使用值轉換器(['BooleanToVisibilityConverter'](http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx))。 –