我正在使用WPF应用程序的模型视图视图模型模式。我有一个ViewModel(设置为页面DataContext)有两个属性,其中一个属性是一个带有PropertyChanged事件的实体。在事件处理程序中,我将另一个属性(布尔值)的值设置为某个值。
现在Button和TextBox属性在首次加载时绑定正常,而PropertyChanged事件正在触发并执行其操作。但是,Button的IsEnable属性不会更新以反映其绑定的属性的更改。
ViewModel看起来像这样:
public sealed class CustomerPageViewModel
{
public Customer Customer
{
get;
set;
}
public bool Editing
{
get;
private set;
}
private void Customer_PropertyChanged(object sender,
System.ComponentModel.PropertyChangedEventArgs e)
{
Editing = true;
}
}
xaml sorta看起来像这样:
<TextBox Text="{Binding Customer.Name}" />
<Button Content="Save Changes" IsEnabled="{Binding Editing}" />
当我更改ViewModel中的底层属性时,如何让Button更新其IsEnable属性?
答案 0 :(得分:4)
那是你的ViewModel的实际代码吗?如果是这样,您的问题是您的ViewModel没有实现INotifyPropertyChanged。 WPF无法知道您的“编辑”VM属性已更改,因此它不会更新按钮的绑定。
答案 1 :(得分:2)
当代码将Editing
设置为true
时,似乎不会触发PropertyChanged
事件,因此Button
不知道它应该更新绑定为IsEnabled
。尝试这样的事情:
public sealed class CustomerPageViewModel : INotifyPropertyChanged
{
public Customer Customer
{
get;
set;
}
private bool editing = false;
public bool Editing
{
get { return editing; }
private set
{
editing = value;
Customer_PropertyChanged(this, new PropertyChangedEventArgs("Editing");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void Customer_PropertyChanged(object sender,
System.ComponentModel.PropertyChangedEventArgs e)
{
PropertyChanged(this, e);
if(!e.PropertyName.Equals("Editing"))
{
Editing = true;
}
}
}
请注意,您必须确认Editing
未导致PropertyChanged
事件触发,否则您将获得无限循环。