Window.InputBindings со связанной коллекцией

Я не могу найти ничего похожего на это онлайн. Я ищу способ создать коллекцию привязок клавиш в коде (с помощью Keybinding ViewModel), а затем связать коллекцию с представлением вместо того, чтобы перечислять каждую привязку вручную в Xaml.

Я ожидаю, что это будет выглядеть примерно так

<Window.InputBindings ItemsSource="{Binding Path=KeybindingList}" />

а затем в коде, есть список. Возможен ли такой подход? С чего бы мне начать?

Ответы на вопрос(1)

Решение Вопроса

прикрепленная собственность, слушайте его изменения и модифицируйтеInputBindings Коллекция связанного окна.

Пример:

// Snippet warning: This may be bad code, do not copy.
public static class AttachedProperties
{
    public static readonly DependencyProperty InputBindingsSourceProperty =
        DependencyProperty.RegisterAttached
            (
                "InputBindingsSource",
                typeof(IEnumerable),
                typeof(AttachedProperties),
                new UIPropertyMetadata(null, InputBindingsSource_Changed)
            );
    public static IEnumerable GetInputBindingsSource(DependencyObject obj)
    {
        return (IEnumerable)obj.GetValue(InputBindingsSourceProperty);
    }
    public static void SetInputBindingsSource(DependencyObject obj, IEnumerable value)
    {
        obj.SetValue(InputBindingsSourceProperty, value);
    }

    private static void InputBindingsSource_Changed(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var uiElement = obj as UIElement;
        if (uiElement == null)
            throw new Exception(String.Format("Object of type '{0}' does not support InputBindings", obj.GetType()));

        uiElement.InputBindings.Clear();
        if (e.NewValue == null)
            return;

        var bindings = (IEnumerable)e.NewValue;
        foreach (var binding in bindings.Cast<InputBinding>())
            uiElement.InputBindings.Add(binding);
    }
}

Это можно использовать на любомUIElement:

<TextBox ext:AttachedProperties.InputBindingsSource="{Binding InputBindingsList}" />

Если вы хотите, чтобы это было очень модно, вы можете проверить тип дляINotifyCollectionChanged и обновитьInputBindings если коллекция изменится, но вам нужно будет отказаться от подписки на старую коллекцию и тому подобное, поэтому вам нужно быть более осторожным с этим.

 Tyrsius23 февр. 2012 г., 18:20
Это фантастическое решение, спасибо!
 H.B.21 февр. 2012 г., 22:49
@ Tyrsius: это не в коде окна, это может быть в любом классе, это как использование преобразователя значений в привязке, не имеет ничего общего с MVVM.
 H.B.21 февр. 2012 г., 23:29
@ Tyrsius: я добавил пример для иллюстрации подхода.
 Tyrsius21 февр. 2012 г., 22:39
Чтобы изменить окно, вам нужно сделать это в коде, верно? Я пытаюсь сделать это, чтобы сохранить в шаблоне MVVM.

Ваш ответ на вопрос