2009-08-11 80 views
1

几个(新手)问题:试图了解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被更新,但CanDeletePerson没有得到更新的值,那么我如何才能再次检查值?

3)我看到

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

你如何订阅事件的事件?

回答

3
  1. 正确的 - 不火
  2. 是,有CanDeletePerson重新评估,可以在CanDeletePerson提高的PropertyChanged,像这样

    set 
        { 
         if ((this.selectedPerson != value)) 
         { 
          this.selectedPerson = value; 
          base.OnPropertyChanged("SelectedPerson"); 
          base.OnPropertyChanged("CanDeletePerson"); 
         } 
        } 
    
  3. 像任何正常事件,但如果你使用WPF,您通常不需要明确订阅

+0

+1你迟了,但我喜欢你的答案的组织。 – 2009-08-11 03:04:59

+0

请参阅http://stackoverflow.com/questions/1329138/how-to-make-databinding-type-safe-and-support-refactoring/1333874#1333874了解编译器检查实现INotifyPropertyChanged的方式。 – 2009-08-26 11:55:41

2

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

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

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

哪里MyClassPropertyChanged是

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

但你不应该需要。 WPF确实订阅了它需要的事件。

+0

+1你打我。 – statenjason 2009-08-11 02:55:48

1

Here's是一篇介绍MVVM模式的好文章的链接。

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

在RelayCommand中对canExecute谓词的求值可以使您不再将单独的属性绑定到Button的IsEnabled属性。

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

该文章对我开始使用该模式非常有帮助。

0

如果您使用PropertyChanged事件,则您的类需要实现INotifyProperyChanged接口并在必要时引发事件。 在WPF中,对于数据绑定默认是DependencyProperty的,所以如果你有PropertyChanged事件的工作,你必须做一些事情到XAML(假设你的类人都在那里你提高PropertyChanged事件Name属性):

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