Пытаясь понять INotifyPropertyChanged - PullRequest
1 голос
/ 11 августа 2009

Несколько (новичок) вопросов:

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 НЕ получает обновленное значение, так как же мне заставить его фактически проверить значение снова? 1019 *

3) Понятно

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

Как подписаться на мероприятие?

Ответы [ 4 ]

3 голосов
/ 11 августа 2009
  1. Правильно - это не стреляет
  2. Да, чтобы переоценить CanDeletePerson, вы можете поднять PropertyChanged на CanDeletePerson, например,

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

2 голосов
/ 11 августа 2009

Да, Auto Properties не запускает событие PropertyChanged.

Вы можете получить CanDeletePerson для повторной оценки, добавив OnPropertyChanged("CanDeletePerson") к SelectedPerson сеттеру.

Я не уверен, является ли ваш последний бит вопросом, но вы можете подписаться на событие PropertyChanged, как и любое другое событие. MyClass.PropertyChanged += MyClassPropertyChanged

Где MyClassPropertyChanged

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

Но тебе не нужно этого делать. WPF подписывается на событие, которое ему нужно.

1 голос
/ 11 августа 2009

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

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

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

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

Эта статья очень помогла мне начать работу с шаблоном.

0 голосов
/ 11 августа 2009

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

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