Pour éviter les KeyBindings codés en dur, j'ai dérivé de la classe RelayCommand de Josh Smith et ajouté des fonctionnalités liées aux raccourcis :
class UIRelayCommand : RelayCommand, INotifyPropertyChanged
{
private static Dictionary modifierText = new Dictionary()
{
{ModifierKeys.None,""},
{ModifierKeys.Control,"Ctrl+"},
{ModifierKeys.Control|ModifierKeys.Shift,"Ctrl+Shift+"},
{ModifierKeys.Control|ModifierKeys.Alt,"Ctrl+Alt+"},
{ModifierKeys.Control|ModifierKeys.Shift|ModifierKeys.Alt,"Ctrl+Shift+Alt+"},
{ModifierKeys.Windows,"Win+"}
};
private Key _key;
public Key Key
{
get { return _key; }
set { _key = value; RaisePropertyChanged("Key"); RaisePropertyChanged("GestureText"); }
}
private ModifierKeys _modifiers;
public ModifierKeys Modifiers
{
get { return _modifiers; }
set { _modifiers = value; RaisePropertyChanged("Modifiers"); RaisePropertyChanged("GestureText");}
}
public string GestureText
{
get { return modifierText[_modifiers] + _key.ToString(); }
}
public UIRelayCommand(Action execute, Predicate canExecute, Key key, ModifierKeys modifiers)
: base(execute, canExecute)
{
_key = key;
_modifiers = modifiers;
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
puis créez la commande dans le ViewModel :
private ICommand _newFileCommand;
public ICommand NewFileCommand
{
get
{
if (_newFileCommand == null)
_newFileCommand = new UIRelayCommand(p => OnNewFile(p), p => CanNewFile(p), Key.N, ModifierKeys.Control);
return _newFileCommand;
}
}
protected void OnNewFile(object p)
{
//open file...
}
protected bool CanNewFile(object p)
{
return true;
}
et liez-le dans la vue :
...
Avec cette approche, je peux permettre à l'utilisateur d'ajuster les raccourcis en cours d'exécution (dans ma fenêtre de configuration)