純粋な MVVM で簡単に動的に追加/削除する方法がわかりません。セッターがないことを正式に指摘したように、コードビハインドからInputBindingsにアクセスしたいと思います。ただし、 InputBindingsとKeyGestureの 2 つを調べるだけで、このケースの設計を崩したくなるかもしれません。そのため、シェルのカスタム コントロールを作成することを検討してください。
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 設計に推定して、上記の例では今のところ無視している View と ViewModel の分離に固執することができます。