Как применить метаданные из ViewModel к представлению в WPF с MVVM - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть модель представления со свойствами, подобными следующим, и набор определенных атрибутов, используемых в моделях представления.

public class MyViewModel : BaseModel
{
    [StringLength(50), Required]
    [SetLockedForExistingEntities]
    public string FirstName { get ...  set ... }

    public bool IsInNewMode { get; }
}

Теперь я хочу применять такие метаданные в представлении согласованным образом. Как ... Если привязано, установите максимальную длину TextBox из атрибута MaxLengthAttribute. Если установлен SetLockedForExistingEntitiesAttribute, отключите элемент управления, если viewModel не находится в каком-то «новом» режиме и т. Д.

Это выполнимо / хорошая идея сделать с пользовательским MarkupExtension, который заменяет «Binding» для VM Bindings? Или было бы лучше использовать Поведение (примененное через присоединенное свойство), которое пытается применить все, что может, из привязанного свойства ViewModel к элементу управления, к которому он присоединен?

Использование будет похоже на

(A) Прикрепленный объект зависимости, который считывает привязку из TextBox.Text и применяет поведение <TextBox Text="{Binding Model.FirstName, ValidatesOnDataErrors=True}" "bb:MyBindingHelper.ApplyViewModelBehaviors="True" />

(B) Custom MarkupExtension, которое делает все в одном <TextBox Text="{BindingWithModelBasedBehaviors Model.FirstName}" />

1 Ответ

0 голосов
/ 25 апреля 2018

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

Это выглядит как подтверждение для меня.Вы можете реализовать inotifydataerrorinfo в базовой модели представления и написать там код, который проверяет свойства с использованием атрибутов.
Вот как работает код в этом коде:
https://gallery.technet.microsoft.com/scriptcenter/WPF-Entity-Framework-MVVM-78cdc204

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

Поскольку определенное свойство не проходит проверку определенным образом, вы можете запустить действие.
Версия производственного кода того приложения, которое я связал, также содержит словарь предикатов и атрибуты.Они могут содержать код в своих ссылках и устанавливать другие свойства viewmodel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...