Я использовал дополнительные свойства для определения функций простых методов в моих ViewModels, чтобы дополнить отсутствие команд:
Bootstapper:
protected override void Configure()
{
var defaultBindActions = ViewModelBinder.BindActions;
ViewModelBinder.BindActions = (elements, viewModelType) =>
{
BindDisplayNameProperties(elements, viewModelType);
return defaultBindActions(elements, viewModelType);
};
}
void BindDisplayNameProperties(IEnumerable<FrameworkElement> elements, Type viewModelType)
{
foreach (var element in elements)
{
var propertyName = element.Name + "DisplayName";
var method = viewModelType.GetMethod(propertyName);
if (method != null)
{
var displayNameProperty = viewModelType.GetPropertyCaseInsensitive(propertyName);
if (displayNameProperty != null)
{
var convention = ConventionManager
.GetElementConvention(element.GetType());
if (element is MenuItem)
{
ConventionManager.SetBindingWithoutBindingOverwrite(
viewModelType,
propertyName,
displayNameProperty,
element,
convention,
MenuItem.HeaderProperty);
}
else
{
ConventionManager.SetBindingWithoutBindingOverwrite(
viewModelType,
propertyName,
displayNameProperty,
element,
convention,
convention.GetBindableProperty(element));
}
}
}
}
}
ViewModel:
public string FooDisplayName { get => "_Foo"; }
public void Foo()
{
//Do stuff
}
Просмотр:
<SomeControl x:Name="Foo"/>
В результате, когда метод привязан по соглашению, функция BindActions Fun c будет искать вспомогательные свойства в виртуальной машине и связывать их либо по соглашениям по умолчанию, либо явно (например, с MenuItems).
Теперь я прочитал этот пост в блоге Найджела Сэмпсона и хотел бы сделать то же самое, но для методов, чтобы устранить некоторый беспорядок в виртуальных машин и создайте более сильную связь между методом и вспомогательными свойствами, а не только соглашение об именах. методологии в сообщении блога, он заблокировал бы свойства элементов представления для дальнейших привязок (и даже ручной настройки в XAML).
Моя идея состоит в том, чтобы повторно перебирать элементы представления ПОСЛЕ запуска функций BindActions и BindProperties, затем проверять наличие элементов с прикрепленными сообщениями ActionMessages и, если их свойства не связаны с привязками или значениями, передавать им значения атрибутов. Но я действительно не знаю, с чего начать, и возможно ли это вообще без изменения ViewModelBinder.
Любые вводимые данные были бы очень признательны. :)