我不知道怎么样很容易动态在纯MVVM中添加/删除。我想从代码隐藏中访问InputBindings,因为您正好注意到缺少setter。不过,您可能会倾向于打破这种情况下的设计,只需看看这两个:InputBindings和KeyGesture。所以考虑为你的shell创建一个自定义控件。
public ObservableCollection<HotkeyModel> Hotkeys { get; private set; }
public class HotkeyWindow : Window
{
HotKeys = new ObservableCollection<HotkeyModel>();
HotKeys.CollectionChanged += new NotifyCollectionChangedEventHandler(HotkeysChanged);
}
void HotkeysChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if(e.Action == NotifyCollectionChangedAction.Add)
{
foreach(HotkeyModel hk in e.NewItems)
this.InputBindings.Add(new InputBinding(hk.Command), new KeyGesture(hk.Key, hk.Modifier));
}
else if(e. Action == NotifyCollectionChangedAction.Remove)
...
}
不要设置InputBindings,而是要添加和删除。保持热键的ObservableCollection并收听CollectionChanged事件。在添加和删除它们时,可以从InputBindings中添加和删除它们。在创建KeyGesture时,您可以设置Keyboard.Modifiers。
所以,你可以把这个概念和外推到一个真正和彻底的MVVM设计,附加/依赖属性和附加行为等,坚持视图和ViewModel分离,我的上面的例子现在忽略。
我添加了一个AttatchedProperty,需要一个BindingCollection,反映了改变我的收藏Window.InputCommands。感谢您的建议。 – Console
@console很高兴我能指出你在正确的方向! – bland