WPF: привязка сочетания клавиш к кнопке на основе содержимого кнопки

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

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

Следующий пример работает:

<Button Content="Picture"
        Command="{Binding TestCmd}">
   <Button.InputBindings>
       <KeyBinding Key="{Binding Shortcuts[Picture]}"
                   Command="{Binding Command, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}"/>
   </Button.InputBindings>
</Button>

Что я хочу сделать, используйте содержимое кнопки в качестве ключа для поиска ярлыка. По сути Key="{Binding Shortcuts[BUTTON.CONTENT]}" но правильный XAML.


person Will Matheson    schedule 23.02.2016    source источник


Ответы (1)


Я не думаю, что это можно сделать только с помощью XAML. Одно из возможных решений — написать для этого конвертер.

XAML:

<Button Content="Picture" Command="{Binding TestCmd}">
    <Button.InputBindings>
        <KeyBinding Command="{Binding Command, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}">
            <KeyBinding.Key>
                <MultiBinding Converter="{StaticResource DictionaryMultiValueConverter}">
                    <Binding Path="Shortcuts" />
                    <Binding Path="Content" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Button}" />
                </MultiBinding>
            </KeyBinding.Key>
        </KeyBinding>
    </Button.InputBindings>
</Button>

И преобразователь:

public class DictionaryMultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if(values.Length != 2)
            throw new ArgumentException(@"DictionaryMultiValueConverter needs exactly two values", "values");

        var dict = values[0] as IDictionary;
        var key = values[1];

        return dict != null && key != null && dict.Contains(key) 
            ? dict[key] 
            : DependencyProperty.UnsetValue;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Преобразователь получает Dictionary в качестве первого значения и ключ для выбора в качестве второго значения. Затем он возвращает значение с переданным ключом из файла Dictionary.

person Szabolcs Dézsi    schedule 23.02.2016
comment
Спасибо. Проблема, которую я обнаружил во всем этом подходе, заключается в том, что кнопка должна быть в фокусе, чтобы слышать нажатия клавиш. Так что я собираюсь пойти в совершенно другом направлении и использовать настраиваемое нажатие клавиш, которое уже работает. Но еще раз спасибо! - person Will Matheson; 26.02.2016