У меня есть модель представления со свойствами, подобными следующим, и набор определенных атрибутов, используемых в моделях представления.
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}" />