2009-08-11 3 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? В принципе, он изначально отключен, но когда я нажимаю на сетку и перемещаю строку в строку, обновляется выбранная версия IS, но CanDeletePerson НЕ получает обновленное значение, так как я могу заставить его фактически проверить значение снова ?

3) Я вижу

... зависит от того, является ли что-то подписался на событие

Как вы подписаться на событие?

ответ

3
  1. Правильно - это не срабатывает
  2. Да, есть CanDeletePerson перепроверены, вы можете поднять PropertyChanged на CanDeletePerson, как так

    set 
        { 
         if ((this.selectedPerson != value)) 
         { 
          this.selectedPerson = value; 
          base.OnPropertyChanged("SelectedPerson"); 
          base.OnPropertyChanged("CanDeletePerson"); 
         } 
        } 
    
  3. Как любое обычное событие, но если вы используя WPF, вам обычно не нужно подписываться явно

+0

+1 У тебя получилось позже, но мне понравилась организация вашего ответа. –

+0

см. Http://stackoverflow.com/questions/1329138/how-to-make-databinding-type-safe-and-support-refactoring/1333874#1333874 для компилятора проверенного способа реализации INotifyPropertyChanged. –

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 подписывается на мероприятие, которое ему нужно.

+0

+1 Ты избил меня. – statenjason

1

Here's ссылка на хорошую статью, представляющую шаблон MVVM.

В частности, если вы посмотрите на класс RelayCommand, он выполняет хорошую задачу по реализации объекта ICommand и позволяет указать предикат для оценки того, можно ли выполнить команду.

Оценка предиката canExecute в RelayCommand избавляет вас от привязки отдельного свойства к свойству IsEnabled Button.

Обычно я следую примеру в статье реализации частного свойства, которое поставляет логическое значение для предиката canExecute.

Эта статья была хорошей помощью для начала работы с шаблоном.

0

Если вы используете событие PropertyChanged, ваш класс должен реализовать интерфейс INotifyProperyChanged и поднять событие там, где это необходимо. В WPF значением по умолчанию для привязки данных является DependencyProperty, поэтому, если вы работаете с событием PropertyChanged, вы должны что-то сделать в XAML (предположим, что у вашего класса есть свойство Name, в котором вы поднимаете событие PropertyChanged):

<TextBlock Text={Binding Path=Name, UpdateSourceTrigger=PropertyChanged} /> 
Смежные вопросы