我不知道如何在纯 MVVM 中轻松地动态添加/删除。我想从代码隐藏中访问 InputBindings,因为您适当地注意到缺少设置器。但是,您可能倾向于仅通过查看以下两个来打破这种情况的设计: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,而是添加和删除。保留 Hotkeys 的 ObservableCollection 并监听 CollectionChanged事件。在添加和删除它们时,您可以在 InputBindings 中添加和删除。创建 KeyGesture 时,可以设置Keyboard.Modifiers。
因此,您可以将这个概念外推到一个真实而彻底的 MVVM 设计中,该设计具有附加/依赖属性和附加行为等,以坚持我上面的示例暂时忽略的 View 和 ViewModel 分离。