【问题标题】:Capturing RaisePropertyChanged from MVVM Light?从 MVVM Light 捕获 RaisePropertyChanged?
【发布时间】:2013-08-09 05:06:31
【问题描述】:
我目前有一个带有布尔属性的模型,用于存储复选框值。当这个值改变时(选中/取消选中)我想显示或隐藏一个文本框。
现在我的文本框的 Visibility 属性在我的 ViewModel 中,而不是在我的模型中。我不确定如何告诉我的 Visibility 属性它应该显示/隐藏,因为复选框的值发生了变化。
我知道我拥有 RaisePropertyChanged 的所有属性,我认为这是我可以使用的东西,但我不知道如何在我的 ViewModel 中捕获它。
或者我是不是把这一切都搞错了?
【问题讨论】:
标签:
c#
.net
windows-phone-7
mvvm
mvvm-light
【解决方案1】:
您的 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 接口并且无法更改您的视图模型逻辑(即您的视图直接绑定到模型的属性),您所能做的就是听取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;
}
}
}