动态菜单与关键手势

时间:2011-02-16 14:20:57

标签: c# wpf data-binding menu gesture

我有一个使用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>

以上所有作品。

我缺少的是Key Gesture的数据绑定。

我读过的每个地方,我只找到Window.InputBindings的静态定义的例子,例如:

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

如果我只是可以在ItemsControl中封装Window.InputBindings,那会很棒。但是这不起作用。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

我猜你可以创建一个自定义的派生窗口对象,它有一个以例如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} ... > ...