Как определить, была ли модель изменена пользователем или кодом - PullRequest
0 голосов
/ 13 мая 2011

Моя модель реализует INotifyPropertyChanged, и к нему привязано окно WPF (двухсторонние привязки).

Мне нужно знать, когда модель изменяется через связанный интерфейс, чтобы я мог вызватьметод обновления из другого модуля (который затем копирует мою модель во внутренние структуры).Модель также может быть изменена другим модулем.

Как определить (в моем PropertyChanged обработчике событий), произошло ли изменение в моем пользовательском интерфейсе, а не в этом другом модуле?

Я не хочу вызывать метод Update, если это был другой модуль, который вызвал событие PropertyChanged.

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Я довольно новичок в WPF, но единственный очевидный способ сделать это - добавить дополнительные методы set в модель, которые изменяют резервное хранилище без непосредственного изменения свойства и, таким образом, запускают Событие PropertyChanged. Чтобы удалить дублирование, установщик свойств должен, вероятно, также вызывать эти методы, и должен быть логический аргумент fireChangedEvent. Примерно так:

public string SomeThing
{
    get { return _someThing; }
    set { SetSomeThing(value, true); }
}

public void SetSomeThing(string value, bool fireChangedEvent)
{
    _someThing = value;
    if(fireChangedEvent)
    {
        NotifyPropertyChanged("SomeThing");
    }
}

Тогда в другом модуле это будет

public void DoStuff
{
    // ...
    model.SetSomeThing("foo",false);
    // ...
}

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

Надеюсь, это хотя бы обходное решение.

0 голосов
/ 06 июня 2011

Есть и другой способ: использование Binding.SourceUpdated

Каждая привязка в окне должна быть установлена ​​NotifyOnSourceUpdated=true, а общий обработчик для события SourceUpdated сделает все остальное (вызвать событие Window.ModelEdited, которое вызовет обновление на другом модуле).

...