1

我有一个使用 Caliburn.Micro 的 .NET 4.0 应用程序。我想创建一个动态菜单,这样我就不需要为每个菜单项编写 XAML 代码。此外,我想将每个命令与一个按键手势相关联。

我有一个接口 IAction:

public interface IAction
{
    string Name { get; }
    InputGesture Gesture { get; }
    ICommand Command { get; }      
}

在我的 ViewModel 中,我公开了一个 IActions 列表:

private List<IAction> _actions;
public List<IAction> Actions
{
    get { return _actions; }
    set
    {
        _actions = value;
        NotifyOfPropertyChange(()=> Actions);
    }
}

我将我的工具栏绑定到如下操作:

<ToolBar>
    <Menu ItemsSource="{Binding Actions}">
        <Menu.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="Header" Value="{Binding Name}" />
                <Setter Property="Command" Value="{Binding Command}" />
            </Style>
        </Menu.ItemContainerStyle>
    </Menu>
</ToolBar>

以上所有工作。

我缺少的是按键手势的数据绑定。

在我阅读的所有地方,我只找到带有 Window.InputBindings 静态定义的示例,例如:

<Window.InputBindings>
  <KeyBinding Key="B" Modifiers="Control" Command="ApplicationCommands.Open" />
</Window.InputBindings>

如果我可以简单地将 Window.InputBindings 封装在 ItemsControl 中,那就太好了,但这不起作用。

你们中的任何人都知道如何动态绑定 Window.InputBindings 吗?

谢谢!

4

1 回答 1

2

必须为窗口对象创建键手势(如果它们要具有窗口范围的效果)。

我想您可以创建一个自定义派生窗口对象,该对象将具有一个名为 example 的依赖项属性BindableInputBindings。每次源集合更改时,其 OnChanged 回调中的此属性将添加/删除键绑定。

编辑:可能有一些错误。

public class WindowWithBindableKeys: Window {

    protected static readonly DependencyProperty BindableKeyBindingsProperty = DependencyProperty.Register(
        "BindableKeyBindings", typeof(CollectionOfYourKeyDefinitions), typeof(WindowWithBindableKeys), new FrameworkPropertyMetadata("", new PropertyChangedCallback(OnBindableKeyBindingsChanged))
    );

    public CollectionOfYourKeyDefinitions BindableKeyBindings
    {
        get
        {
            return (string)GetValue(BindableKeyBindingsProperty);
        }
        set
        {
            SetValue(BindableKeyBindingsProperty, value);
        }
    }

    private static void OnBindableKeyBindingsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        (d as WindowWithBindableKeys).InputBindings.Clear();

        // add the input bidnings according to the BindableKeyBindings
    }

}

然后在 XAML

<mynamespace:WindowWithBindableKeys BindableKeyBindings={Binding YourSourceOfKeyBindings} ... > ...
于 2011-02-16T15:14:35.677 回答