Как подписаться на событие PropertyChanged в моей ViewModel? - PullRequest
17 голосов
/ 19 октября 2011

У меня есть основные функции, инкапсулированные в ViewModelBase

Теперь я хочу увидеть, когда событие PropertyChanged было вызвано ViewModelBase, и действовать в соответствии с ним.Например, когда одно свойство было изменено в ViewModelBase - я хочу изменить свойство в моей ViewModel

Как мне добиться этого?

public class MaintainGroupViewModel : BaseViewModel<MEMGroup>
    {


public abstract class BaseViewModel<T> : NotificationObject, INavigationAware
        where T : Entity
    {

Ответы [ 3 ]

56 голосов
/ 19 октября 2011

Обычно я использую регистр для события PropertyChanged в классе Конструктор

public MyViewModel()
{
    this.PropertyChanged += MyViewModel_PropertyChanged;
}

и мой обработчик события PropertyChanged выглядит так:

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case "SomeProperty":
            // Do something
            break;
    }
}
11 голосов
/ 19 октября 2011

Я обеспокоен тем, что вы фактически делаете «ручное связывание» (плохое) для свойства в производном классе со значением в базовом классе (также плохое). Весь смысл использования наследования состоит в том, что производный класс может получить доступ к вещам в базовом классе. Используйте модификатор protected, чтобы указать, что вещи должны быть доступны только для производных классов.

Я бы предложил этот (потенциально) более правильный метод:

Базовый класс:

protected virtual void OnMyValueChanged() { }

Производный класс:

protected override void OnMyValueChanged() { /* respond here */ }

Действительно, подписка на событие в базовом классе того самого класса, который вы пишете, кажется невероятно задом наперед - какой смысл использовать наследование над композицией, если вы собираетесь собирать себя вокруг себя? Вы буквально просите объект сказать себе, когда что-то происходит. Вы должны использовать для этого вызов метода.

В терминах "когда одно свойство было изменено в ViewModelBase - я хочу изменить свойство в моей ViewModel" , ... это один и тот же объект!

2 голосов
/ 19 октября 2011

Прямой способ подписаться на изменения свойства - использовать INotifyPropertyChanged, если ваш BaseViewModel реализует его:

PropertyChanged += (obj, args) =>
   { System.Console.WriteLine("Property " + args.PropertyName + " changed"); }

Если это не так, то это должно быть DependencyObject, а ваши свойства должны быть DependencyProperties (что, вероятно, является более сложным способом).

В этой статье описывается, как подписаться на DependencyProperty изменения.

...