|
Валидация во вложенной вьюмодели
|
|||
---|---|---|---|
#18+
Всем привет! Имеем окно со своей вьюмоделью, в окне размещен Page со своей моделью. В основном окне можно нажать OK только если нет ошибок (string Error is empty). Как передать текст ошибки валидации из модели страницы в модель родительского окна? В конструкторе страницы передать ссылку на строку ошибки? Дёргать какое-то событие окна? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2021, 07:19 |
|
Валидация во вложенной вьюмодели
|
|||
---|---|---|---|
#18+
Евгений, Екатеринбург, реализация решения очень зависима от деталей созданной архитектуры. Приведу два основных (на мой взгляд вариантов): 1) VM страницы является вложенной (дочерней - CVM) по отношению к основной VM (MVM) Окна. В этом случае можно внедрить в CVM некий объест свойства которого будет менять CVM Но ссылка на объект останется и МVM - поэтому MVM без проблем сможет сама валидировать этот объект. Если передавать надо только одно значение, то можно в CVM просто добавить одно-два свойства нужного типа. Возможно они уже и так есть, так как вы же в странице к чему-то привязываетесь. И MVM по событию PropertyChanged из CVM будет валидировать это свойство. 2) VM страницы и VM Окна независимы, то есть это одноранговые объекты "не знающие" друг о друге. В этом случае очевидно нужно как-то передать (привязать) значения UI элемента страницы к VM Окна. На мой взгляд это проще решить установкой прокси в ресурсах Окна получающего VM Окна. Тогда в странице будет возможно задать привязку к этому прокси. Но это решение критично к компоновке. Не в каждой компоновке ресурсы Окна будут видны в странице. P.S. Уточняющие вопросы: 1) У вас WPF (Core или FW) или UWP? 2) Почему Страница, а не UserControl? В большинстве случаев использование Frame+Page неоправданно и их лучше заменить на UserControl. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2021, 11:23 |
|
Валидация во вложенной вьюмодели
|
|||
---|---|---|---|
#18+
Eld Hasp, Спасибо! Я сделал универсальное окно с кнопками Ok и Cancel, и в это окон во фрейм подсовывается Page с нужными контролами редактирования сущности. В самой Page значения валидируются, но я хочу сделать чтобы если есть ошибки, то в окне кнопка Ok была недоступна. Т.е. в команде, к котрой биндится кнопка нужно проверять какое-то свойство (например, Error дочерней CVM). Но может я не там копаю. А чем UserControl лучше чем Frame? У меня WPF, .Net 4.6.1 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2021, 13:09 |
|
Валидация во вложенной вьюмодели
|
|||
---|---|---|---|
#18+
Евгений, Екатеринбург А чем UserControl лучше чем Frame? Не Frame, а Frame+Page. 1) UserControl применяется сам по себе. Не нужна связка из двух элементов. 2) Он наследует Контекст Данных от вышестоящего контейнера (чаще всего от Окна), что намного удобнее в контексте реализации MVVM. 3) По сути использование Frame+Page вне встроенной навигации - лишено смысла. И даже в случае использовании встроенной навигации реализация с использованием UserControl очень часто оказывается проще, прозрачнее, управлемее. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 14:37 |
|
Валидация во вложенной вьюмодели
|
|||
---|---|---|---|
#18+
Евгений, Екатеринбург Я сделал универсальное окно с кнопками Ok и Cancel, и в это окон во фрейм подсовывается Page с нужными контролами редактирования сущности. В самой Page значения валидируются, но я хочу сделать чтобы если есть ошибки, то в окне кнопка Ok была недоступна. Т.е. в команде, к котрой биндится кнопка нужно проверять какое-то свойство (например, Error дочерней CVM). Если у вас команда кнопки ОК объявлена в ОСНОВНОЙ VM, то вы же без проблем можете в CanExecute проверять свойство дочерней VM. Что вам мешает? Для более конкретного ответа - нужно больше деталей вашей реализации: - коды основной и дочерней VM относящиеся к вопросу; - как создаются VM и как дочерняя внедряется в основную; - XAML компоновки в части Page и создания Контекста Данных Окна и Page. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 14:43 |
|
|
start [/forum/topic.php?fid=21&msg=40069626&tid=1440242]: |
0ms |
get settings: |
18ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
16ms |
get forum data: |
3ms |
get page messages: |
145ms |
get tp. blocked users: |
3ms |
others: | 317ms |
total: | 573ms |
0 / 0 |