【问题标题】:WPF: refreshing a control with a bound property using Model View View-ModelWPF:使用模型视图视图模型刷新具有绑定属性的控件
【发布时间】:2010-11-06 00:38:03
【问题描述】:

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

【问题讨论】:

    标签: wpf data-binding mvvm properties inotifypropertychanged


    【解决方案1】:

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

    【讨论】:

    • 哎呀,你的权利。我现在实现了界面并在编辑更改时引发了事件。这就是我们所需要的。谢谢。
    【解决方案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 事件触发,否则您将获得无限循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多