WPF:使用模型视图视图模型刷新具有绑定属性的控件

时间:2009-06-26 01:29:42

标签: wpf data-binding mvvm properties inotifypropertychanged

我正在使用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属性?

2 个答案:

答案 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事件触发,否则您将获得无限循环。