1

我正在为 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 排序看起来像这样:

<TextBox Text="{Binding Customer.Name}" />   
<Button Content="Save Changes" IsEnabled="{Binding Editing}" />

当我更改 ViewModel 中的基础属性时,如何让 Button 更新其 IsEnable 属性?

4

2 回答 2

4

那是您的 ViewModel 的实际代码吗?如果是这样,您的问题是您的 ViewModel 没有实现 INotifyPropertyChanged。WPF 无法知道您的“编辑”VM 属性已更改,因此它不会更新按钮的绑定。

于 2009-06-26T01:53:25.897 回答
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事件触发,否则您将获得无限循环。

于 2009-06-26T01:54:06.020 回答