试图了解INotifyPropertyChanged

时间:2009-08-11 02:49:11

标签: c# wpf data-binding inotifypropertychanged

几个(新手)问题:

1)我看到了很多

public Person SelectedPerson { get; set; } 

我假设这不会引发财产变更?

所以,如果我想这样做,我必须提供以下内容?

    private Person selectedPerson;
    public Person SelectedPerson
    {
        get
        {
            return this.selectedPerson;
        }
        set
        {
            if ((this.selectedPerson != value))
            {
                this.selectedPerson = value;
                base.OnPropertyChanged("SelectedPerson");
                // Note: Using ViewModelBase

            }
        }
    }

2)如果我有以下内容:

    public bool CanDeletePerson
    {
        get
        {
            return SelectedPerson != null;
        }
    }

以及XAML

< Button IsEnabled="{Binding CanDeletePerson}" 
Command="{Binding DeletePersonCommand}"> Delete </ Button >

如何让它重新评估CanDeletePerson属性? 基本上,它最初是禁用的,但是当我单击网格并将行移动到行时,SelectedPerson IS正在更新,但CanDeletePerson没有获得更新的值,那么如何让它再次实际检查该值呢? / p>

3)我看到了

  

...取决于是否有任何订阅事件

您如何订阅此活动?

4 个答案:

答案 0 :(得分:3)

  1. 正确 - 不会触发
  2. 是的,要重新评估CanDeletePerson,您可以在CanDeletePerson上提升PropertyChanged,就像这样

        set
        { 
            if ((this.selectedPerson != value))
            { 
                this.selectedPerson = value; 
                base.OnPropertyChanged("SelectedPerson"); 
                base.OnPropertyChanged("CanDeletePerson");
            }
        }
    
  3. 与任何正常事件一样,但如果您使用的是WPF,则通常无需明确订阅

答案 1 :(得分:2)

是,自动属性不会触发PropertyChanged事件。

您可以通过将CanDeletePerson添加到OnPropertyChanged("CanDeletePerson")设置者来重新评估SelectedPerson

我不确定您的最后一位是否是一个问题,但您可以像任何其他事件一样订阅PropertyChanged事件。 MyClass.PropertyChanged += MyClassPropertyChanged

MyClassPropertyChanged在哪里

private void MyClassPropertyChanged(object sender, PropertyChangedEventArgs args)
{
    args.PropertyName .... //<-- Name of property changed.
}

但你不应该这样做。 WPF会订阅它所需的事件。

答案 2 :(得分:1)

Here's指向介绍MVVM模式的好文章的链接。

具体来说,如果查看RelayCommand类,它可以很好地实现ICommand对象,并允许您指定谓词来评估Command是否可以执行。

RelayCommand中对canExecute谓词的评估可以避免将单独的属性绑定到Button的IsEnabled属性。

我通常遵循实现私有属性的文章中的示例,该属性为canExecute谓词提供布尔值。

这篇文章对我开始使用这个模式很有帮助。

答案 3 :(得分:0)

如果使用PropertyChanged事件,则您的类需要实现INotifyProperyChanged接口并在必要时引发事件。 在WPF中,数据绑定的默认值是DependencyProperty,因此如果您使用PropertyChanged事件,则必须对XAML执行某些操作(假设您的类人员具有您举起PropertyChanged事件的Name属性):

<TextBlock Text={Binding Path=Name, UpdateSourceTrigger=PropertyChanged} />