2010-12-30 3 views
2

Вот пример сценарий ориентируется MVVM развития WPF/SL:Как мы можем реализовать распространение уведомлений об изменениях для WPF и SL в шаблоне MVVM?

  • Просмотр данных связывающимися для просмотра свойств модели «Target»
  • «Target» выставляет поле объекта под названием «данные», которые существует в локальной модели приложения, называемой «Оригинал»
  • , когда изменения «оригинала» должны поднять уведомление к модели представления, а затем распространить уведомление об изменении на представление.

Вот решения, которые я придумал, но мне не нравится ни один из них. Я ищу другие идеи, к тому времени, когда мы придумаем что-то твердое, я уверен, что Microsoft выпустит .NET 5 с расширениями WPF/SL для улучшения инструментов для разработки MVVM.

На данный момент возникает вопрос: «Что вы сделали для решения этой проблемы и как она сработала для вас?»

Вариант 1.

Предложение:

Присоединить обработчик данных «s PropertyChanged случае, если часы для строковых значений свойств она заботится о том, что, возможно, изменились, и рейзы соответствующее уведомление.

Почему я не люблю:

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

Почему я вроде этого:

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

Вариант 2.

Предложение:

Присоединить обработчик данных «s PropertyChanged событие, которое повторно вызывает событие во всех свойств, используя имя имя свойства.

Почему я не люблю:

Это, по существу, такой же, как вариант 1, но менее разумны, и заставляет меня никогда не менять свои имена свойств, так как они должны быть такими же, как имена свойств на данных

Почему я вроде как это:

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

Вариант 3.

Предложение:

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

Почему я не люблю:

Я даже не 100% уверен, что свойства зависимостях/объекты могут это сделать, это просто мысль заглянуть. Также я лично не считаю, что типы WPF/SL, такие как Dep Obj, относятся к уровню модели представления.

Почему я вроде этого:

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

Вариант 4.

Предложение:

Используйте непротиворечивую систему обмена сообщений агента на основе офф задачи Parallels DataFlow библиотеки на распространение информации через все связан конвейерный.

Почему я не люблю:

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

Почему я вроде как это:

Он имеет Possiblity позволять мне делать некоторые очень забавные манипуляции с моделью данных нажимной на основе и с использованием ActionBlocks как проверки и установки на то приватно изменить свойства вид модели и явно контролировать уведомления PropertyChanged.

ответ

1

В основном я использовал вариант 4. Когда изменяется состояние приложения (и, следовательно, данные в модели меняются), я отправляю уведомление с использованием MVVM FoundationMessenger. ViewModels, которым нужны эти данные для привязки данных, могут затем подписаться на это сообщение, соответствующим образом обновить локальные свойства и вызвать RaisePropertyChanged() *, чтобы уведомить систему привязки о том, что произошло изменение.

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

Самый большой недостаток, который я заметил, заключается в том, что сложнее использовать код отладки, который значительно облегчает использование Messenger. В принципе, когда генерируется исключение, вы попадаете в метод класса Messenger вместо фактического нарушившего кода. Я думаю, это потому, что потому, что Messenger использует слабые ссылки. Вы научитесь решать эту проблему, но это определенно не идеально.

В недавнем приложении, над которым я работал, я решил централизовать все изменения данных приложения в одном большом, но простом классе под названием AppDataManager. Этот класс имеет поля для всех данных, которые необходимо отслеживать изменения. После некоторой инициализации при запуске изменения данных всегда или почти всегда инициируются пользователем. Благодаря двусторонней привязке данных действия пользователя приводят к изменению свойства в ViewModel. Это изменение затем пересылается в сообщение AppDataManager. Затем AppDataManager изменяет собственную ссылку на эти данные и отправляет сообщение, чтобы уведомить любые заинтересованные ViewModels о том, что эти данные были изменены. Обычно я включаю измененные данные в сообщение (поэтому получателю не нужно знать, где найти данные). Я не уверен, что это лучшая архитектура, и я не знаю, как она будет масштабироваться для больших приложений, но, похоже, она до сих пор хорошо работала для меня.

Очевидно, что альтернативным подходом к централизации будет сетевой подход, при котором ViewModels подписываются непосредственно на сообщения друг друга. Это очень хорошо может работать, но я не пробовал. Я обнаружил, что я мог бы реализовать систему отмены намного легче, если все изменения в данных были перенаправлены через один класс. Мои данные также были иерархически упорядочены, поэтому изменения в верхней части иерархии должны были бы каскадироваться до «листьев» (например, если вы меняете карту, вам нужно изменить дороги, и если вы измените дороги, у вас есть для изменения путевых точек, составляющих дороги). Мне было намного проще управлять этим каскадом централизованно, чем выбирать произвольный ViewModel для этого.

* RaisePropertyChanged является членом ObservableObject, который также является частью Фонда MVVM. Все ViewModels в моем проекте наследуются от ObservableObject.

Примечание: Я собираюсь перейти от Фонда MVVM к MVVM Light Toolkit, что, по-видимому, является дальнейшей разработкой Фонда MVVM.

+0

Вы отправляете сообщения с вашей модели всем, кто интересуется? –

+0

@chibacity, да. – devuxer

+0

@Dan Так что в сущности модели могут отображать сообщения. Это нарушает слоирование MVVM. –

Смежные вопросы