我有一个使用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吗?
谢谢!
答案 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} ... > ...