Добавление использования атрибутов метода в соглашения Caliburn Micro - PullRequest
0 голосов
/ 07 мая 2020

Я использовал дополнительные свойства для определения функций простых методов в моих 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.

Любые вводимые данные были бы очень признательны. :)

...