我不知道怎麼樣很容易動態在純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