Можно ли использовать постоянное / статическое значение внутри привязки в XAML? - PullRequest
0 голосов
/ 11 июня 2018

Мы используем следующий механизм / синтаксис для связывания команд в XAML:

Command="{Binding CommandAggregator[FooCmd], Mode=OneTime}"

Здесь CommandAggregator - это объект, для которого вы можете использовать индексатор (с параметром string) для полученияназад текущая команда.

Регистрация команд с помощью агрегатора вызывает у меня некоторое беспокойство, потому что мы все еще используем магические строки для названий команд, таких как:

this.CommandAggregator.SetCommand("FooCmd", new RelayCommand(execute, canExecute));

Пока я неНе обязательно, как весь этот процесс, я не могу многое изменить.Единственное, что я хотел бы сейчас сделать - это перестать использовать магические строки, сделав их постоянными или static readonly string объектами внутри статического CommandName класса.

Но можно ли определить привязку внутриXAML и ссылка на константу (скажем, CommandName.Foo)?Я думал об использовании {x:Static ...}, но не знаю, как получить возвращенное значение в индексатор.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Не уверен, что это лучше, но у меня работает.Мне не нравилось так много CmdWhatEvers для моих команд Relay, отображаемых в моем отладчике, поэтому я переместил их в словарь, который похож на ваш CommandAggregator, а затем проиндексировал их статической строкой (магические строки вызвали у меня столько ошибок связывания.) В любом случае, мои строковые константы живут в статическом классе

internal static class Str
{
    public static readonly string CmdReset = "CmdReset";
}

В модели представления

internal class CtrlVm : ViewModelBase
{
    public Dictionary<string, IRelayCommand> Commands { get; }

    public CtrlVm()
    {
        Commands = new Dictionary<string, IRelayCommand>()
        {
            // My relay command class takes, Execute, CanExecute
            //  and a Header parameter, that I use in binding
            Str.CmdReset, new RelayCommand(Reset, CanReset, "Reset");
        },
    }
    private bool CanReset(object parameter)
    {
        return bHasChanges; // or whatever
    }
    private void Reset(object parameter)
    {
        // do the reset work
    }
}

Затем в Xaml <Button Command= "{Binding Commands[CmdReset]}" Content= "{Binding Commands[CmdReset].Header}"/>

0 голосов
/ 11 июня 2018

вы можете реализовать IValueConverter, который будет возвращать команду из CommandAggregator на основе параметра конвертера:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var aggregator = value as CommandAggregator;
    var cmd = parameter as string;
    if (aggregator != null && cmd != null)
       return aggregator[cmd];
    return null;
}

и передавать параметр из xaml:

Command="{Binding Path=CommandAggregator,
                  Converter={StaticResource MyConverter}, 
                  ConverterParameter={x:Static Constants.FooCmd},
                  Mode=OneTime}"
...