2013-08-07 2 views
0

В настоящее время у меня есть модель с булевым свойством, которое хранит значение флажка. Когда это значение изменяется (отмечено/не отмечено), я хочу показать или скрыть текстовое поле.Захват RaisePropertyChanged от MVVM Light?

Теперь свойство моей видимости для текстового поля находится в моей модели ViewModel, а не в моей модели. Я не уверен, как сообщить свой Свойство Видимости, что он должен показать/скрыть, потому что значение флажка изменилось.

Я знаю, что у меня есть RaisePropertyChanged, и я думаю, что это было бы чем-то, что я мог бы использовать, но я не знаю, как его захватить в моей модели ViewModel.

Или я подхожу к этому все неправильно?

ответ

0

Ваш ViewModel должен выступать в качестве затвора между вашей моделью и вашим представлением. Похоже, что ваш флажок привязан непосредственно к модели. Он должен быть привязан к соответствующему свойству View Model, которое будет действовать как поведение соответствующего значения вашей модели. Например (отказ от ответственности: я не использовал MVVM Light, но это должно быть сам пояснительной для большинства структур 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-света любит просто связывать с моделью в таком случае, я показал, чтобы избежать дубликатов. Вы можете увидеть это видео http://channel9.msdn.com/events/MIX/MIX11/OPN03 около 9 минут. – chobo2

+0

Если вы привязываете непосредственно свое представление к модели, ваша модель просмотра должна подписаться на событие «PropertyChanged» (модель в конструкторе была для надуманного короткого примера). Или используйте конвертер значений в вашем представлении (['BooleanToVisibilityConverter'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx) приходит на ум). –