MVVM — обработчик свойств измененных событий

Я начинаю с MVVM.

Мое приложение использует этот "шаблон (шаблон PM - давайте не будем обсуждать это здесь :))" и отлично работает; Проект очень простой и предположительно легкий для начинающих!! Лишь бы было... :)

Меня озадачивает одна вещь, которая может не иметь ничего общего с MVVM как таковой; Обработчик PropertyChangedEventHandler.

Я просматриваю свой код, строка за строкой, и вижу вызов (код ниже), но я не уверен, почему я вызываю этот обработчик или что он делает!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Input;

namespace drMVVM.Model
{
    public class TextContent : INotifyPropertyChanged
    {
        private string text;
        public string Text
        {
            get { return text; }
            set
            {
                if (text != value)
                {
                    text = value;
                    OnPropertyChanged("Text");
                }
            }
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }
}

У меня также есть аналогичный макет кода для моей модели представления, но вместо установки свойств я просто создаю экземпляр объекта и применяю любую дополнительную логику.

Используется ли PropertyChangedEventArgs для обновления только свойств модели, если что-то изменилось? Если да, то почему он реализован в классе модели, а не только в ModelView? Это потому, что он может инстинктивно знать, следует ли просто слушать изменения или предоставить подробности уведомления о том, что изменение произошло? Если это уведомление (я так предполагаю, отсюда и название интерфейса), то что я уведомляю в своем классе модели?


person Dave    schedule 03.07.2012    source источник


Ответы (1)


INotifyPropertyChanged требуется всякий раз, когда вы хотите уведомить кого-либо об изменениях ваших свойств. Поэтому, если вашей ViewModel необходимо уведомлять представление об изменениях, чтобы представление обновляло свою привязку данных, вам ViewModel необходимо реализовать его и вызывать событие при каждом изменении свойств.

Аналогично, если у вашей модели есть свойства, которые могут изменяться, и вы хотите получать уведомления о них, то также реализуйте их в своей модели.

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

person poke    schedule 03.07.2012
comment
Аааа... Итак, когда мой пользовательский интерфейс изменяется (который привязан к виртуальной машине, виртуальная машина уведомляет модель. Модель обновляется, а затем повторно уведомляет виртуальную машину, которая затем может уведомлять представление? Это звучит правильно? (VM = представление модель) - person Dave; 03.07.2012
comment
Нет, он идет от INotifyPropertyChanged к тому, что с ним связано. Когда пользовательский интерфейс изменяется, он напрямую обновляет значения, к которым он привязан. Но когда данные изменяются, событие уведомляет пользовательский интерфейс об обновлении отображаемых значений. Аналогично, когда виртуальная машина привязана к модели, и модель обновляет свои значения, она уведомляет виртуальную машину. - person poke; 03.07.2012
comment
хммм... Теперь я снова вернулся к исходной точке! :) Мой пользовательский интерфейс привязан к объекту в виртуальной машине. ВМ создает экземпляр моей модели. И виртуальная машина, и модель используют интерфейс INotifyProperyChanged. Таким образом, когда пользовательский интерфейс изменяется, он фактически обновляет модель (через виртуальную машину, которая создала экземпляр объекта). Затем это запускает (вызывает событие) событие PropertyChanged, которое обновляет виртуальную машину, которая затем запускает событие PropertyChanged, которое затем, в свою очередь, обновляет пользовательский интерфейс (представление)? - person Dave; 03.07.2012
comment
В этом случае да, хотя объект модели в вашей виртуальной машине не вызывает автоматически событие из свойства виртуальной машины, так что, вероятно, этого не произойдет. Но да, обычно для привязки данных событие требуется только для обновления привязок на стороне представления, поскольку изменения в представлении напрямую изменяют привязки и, следовательно, базовые объекты. - person poke; 03.07.2012