WPF vs MVVM
От: IB Австрия http://rsdn.ru
Дата: 13.08.15 07:30
Оценка:
Вопрос скорее архитектурный, интересуют принятые практики.
Идеологически MVVM предполагает, что обработкой событий от элементов UI занимается ModelView и ICommand, которые отвязаны от собственно UI, что правильно.
Но возникает одна проблемма — как в этом случае изменить UI, после обработки соответствующей команды? Вешать еще обработчик на Click, исключительно для UI логики или подписывать UI объекты типа Window на обработку событий от MVVM?
Мы уже победили, просто это еще не так заметно...
Re: WPF vs MVVM
От: s_aa Россия  
Дата: 13.08.15 07:34
Оценка:
IB>Вопрос скорее архитектурный, интересуют принятые практики.
IB>Идеологически MVVM предполагает, что обработкой событий от элементов UI занимается ModelView и ICommand, которые отвязаны от собственно UI, что правильно.
IB>Но возникает одна проблемма — как в этом случае изменить UI, после обработки соответствующей команды? Вешать еще обработчик на Click, исключительно для UI логики или подписывать UI объекты типа Window на обработку событий от MVVM?

UI биндится к свойствам ModelView, при изменении свойств автоматов меняется UI.
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re: WPF vs MVVM
От: andrey82  
Дата: 13.08.15 07:36
Оценка:
Здравствуйте, IB, Вы писали:

IB>Вопрос скорее архитектурный, интересуют принятые практики.

IB>Идеологически MVVM предполагает, что обработкой событий от элементов UI занимается ModelView и ICommand, которые отвязаны от собственно UI, что правильно.
IB>Но возникает одна проблемма — как в этом случае изменить UI, после обработки соответствующей команды? Вешать еще обработчик на Click, исключительно для UI логики или подписывать UI объекты типа Window на обработку событий от MVVM?

Вроде же стандартное решение — биндинг свойств UI элементов к public свойствам ViewModel и генерация события PropertyChanged при изменении значения. Или что понимается под "изменить UI"?
Re: WPF vs MVVM
От: MxMsk Португалия  
Дата: 13.08.15 09:14
Оценка: 40 (1) +1
Здравствуйте, IB, Вы писали:

IB>Вопрос скорее архитектурный, интересуют принятые практики.

IB>Идеологически MVVM предполагает, что обработкой событий от элементов UI занимается ModelView и ICommand, которые отвязаны от собственно UI, что правильно.
IB>Но возникает одна проблемма — как в этом случае изменить UI, после обработки соответствующей команды? Вешать еще обработчик на Click, исключительно для UI логики или подписывать UI объекты типа Window на обработку событий от MVVM?
Чаще всего достаточно описанных выше решений: команда меняет свойства, меняется UI.
Если нет свойств: подписываемся на события, которые генерируются где-то в модели.
Еще один подход: attached behavior под конкретный сценарий. В принципе то же самое, что на события подписываться, зато появляется реюзабельность.
Re: WPF vs MVVM
От: Codechanger Россия  
Дата: 13.08.15 09:27
Оценка:
Здравствуйте, IB, Вы писали:

IB>Вопрос скорее архитектурный, интересуют принятые практики.

IB>Идеологически MVVM предполагает, что обработкой событий от элементов UI занимается ModelView и ICommand, которые отвязаны от собственно UI, что правильно.
IB>Но возникает одна проблемма — как в этом случае изменить UI, после обработки соответствующей команды? Вешать еще обработчик на Click, исключительно для UI логики или подписывать UI объекты типа Window на обработку событий от MVVM?

Объекты типа Window лучше тоже спрятать за какими-то интерфейсами.
Re: WPF vs MVVM
От: IT Россия linq2db.com
Дата: 14.08.15 01:23
Оценка: 40 (1)
Здравствуйте, IB, Вы писали:

IB>Идеологически MVVM предполагает, что обработкой событий от элементов UI занимается ModelView и ICommand, которые отвязаны от собственно UI, что правильно.


ViewModel.

IB>Но возникает одна проблемма — как в этом случае изменить UI, после обработки соответствующей команды?


Вплоть до смены декораций, если свойство контрола Visible забаиндить на соответствующее свойство модели либо подвесить на него триггер.

Единственный спорный в плане кошерности вопрос на сегодня — это создание новых UI объектов типа окон как результат на реакцию происходящих в модели событый. Один из кошерно-интеллигентских вариантов — создание модели нового окна через фабрику, где вместе с моделью магическим путём создаётся новоё окно. Рабоче-крестьянский способ — не париться и создавать окно (о! ужос!) прямо из модели.
Если нам не помогут, то мы тоже никого не пощадим.
Re: WPF vs MVVM
От: Venom  
Дата: 14.08.15 05:19
Оценка:
Здравствуйте, IB, Вы писали:

IB>Вопрос скорее архитектурный, интересуют принятые практики.

IB>Идеологически MVVM предполагает, что обработкой событий от элементов UI занимается ModelView и ICommand, которые отвязаны от собственно UI, что правильно.
IB>Но возникает одна проблемма — как в этом случае изменить UI, после обработки соответствующей команды? Вешать еще обработчик на Click, исключительно для UI логики или подписывать UI объекты типа Window на обработку событий от MVVM?

Идеологически в xaml.cs не должно быть ничего.
В общем случае, проблема решается с помощью Behavior<T>, где T, это визуальный элемент к которому behavior атачится, e.g. T = TextBox.
В частном случае (и в большинстве случаев), проблема решается с помощью свойств ViewModel.
При этом никаких обработчиков никуда не вешается и не нарушается принципа отсутствия прямой зависимости между UI и ViewModel.

Т.е. когда не получается забиндиться на свойства ViewModel, приходится делать Behavior.
Re[2]: WPF vs MVVM
От: IB Австрия http://rsdn.ru
Дата: 14.08.15 11:10
Оценка:
Здравствуйте, IT, Вы писали:

IT>Единственный спорный в плане кошерности вопрос на сегодня — это создание новых UI объектов типа окон как результат на реакцию происходящих в модели событый.

Вот! Ты знал. )
Мы уже победили, просто это еще не так заметно...
Re[2]: WPF vs MVVM
От: tofox2 Россия  
Дата: 15.08.15 06:32
Оценка: +1
Здравствуйте, Venom, Вы писали:

V>Идеологически в xaml.cs не должно быть ничего.


Паттерны не должны быть сильнее здравого смысла.
Если например модель поменялась, и вам надо вызвать метод Refresh() какого-то стороннего контрола, карты например, которое не сделать биндингом.
Делать тут специальный behavior имхо глупо, проще передать сообщение.
Re[2]: WPF vs MVVM
От: Mr.Delphist  
Дата: 16.11.15 15:30
Оценка:
Здравствуйте, IT, Вы писали:

IT>Единственный спорный в плане кошерности вопрос на сегодня — это создание новых UI объектов типа окон как результат на реакцию происходящих в модели событый. Один из кошерно-интеллигентских вариантов — создание модели нового окна через фабрику, где вместе с моделью магическим путём создаётся новоё окно. Рабоче-крестьянский способ — не париться и создавать окно (о! ужос!) прямо из модели.


Ну, вот вроде феншуйный способ http://stackoverflow.com/a/3388241/1964969
Всё остаётся на уровне View. А инстанс ViewModel будет создаваться через какой-то инжектор/локатор, благо матчинг DataTemplate позволяет добиться этого без проблем:

<DataTemplate DataType="{x:Type MyViewModel}">
    <MyViewOrControl />
</DataTemplate>
Re: WPF vs MVVM
От: Sinatr Германия  
Дата: 17.11.15 08:03
Оценка:
Здравствуйте, IB, Вы писали:

IB>Но возникает одна проблемма — как в этом случае изменить UI, после обработки соответствующей команды? Вешать еще обработчик на Click, исключительно для UI логики или подписывать UI объекты типа Window на обработку событий от MVVM?


Оставлю это здесь (украдено отсюда):



Начните с того, что проще, убедитесь, что работает и сделайте рефакторинг. При рефакторинге код из view можно cпрятать в attached behavior, события MVVM (на которые вы хотите подписать view) переделываются в обычные property + binding. Сильно увлекаться не советую, это только для фанатиков (pure MVVM) требуется, чтобы во View не быть кода. Обычным людям достаточно сделать код DRY (повторяемый во View код -> behavior).

Если вы конкретизируете проблему (что именно требуется менять и в каком контроле), то можно будет посоветовать что-то конкретное. В MVVM хватает танцев с бубном (один заковыристее другого) для PasswordBox, multi-selection List controls, и т.д.
---
ПроГLамеры объединяйтесь..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.