Si intenta definir CommandBindings
o InputBindings
como recursos en su App.xaml
, se encuentra que no se puede utilizar, porque XAML no permite que usted utilice, ya sea:
<Window ... CommandBindings="{StaticResource commandBindings}">
oa establecer enlaces de comando con un conjunto de estilos:
<Setter Property="CommandBindings" Value="{StaticResource commandBindings}">
porque ninguna de estas propiedades tiene un descriptor de acceso "establecido". Al usar la idea en this post, se me ocurrió una forma clara de usar los recursos del App.xaml
o cualquier otro diccionario de recursos.
En primer lugar, definir sus ataduras de mando y enlaces de entrada indirectamente, al igual que lo haría con cualquier otro recurso:
<InputBindingCollection x:Key="inputBindings">
<KeyBinding Command="Help" Key="H" Modifiers="Ctrl"/>
</InputBindingCollection>
<CommandBindingCollection x:Key="commandBindings">
<CommandBinding Command="Help" Executed="CommandBinding_Executed"/>
</CommandBindingCollection>
y luego se refieren a los mismos desde el XAML de otra clase:
<Window ...>
<i:Interaction.Behaviors>
<local:CollectionSetterBehavior Property="InputBindings" Value="{StaticResource inputBindings}"/>
<local:CollectionSetterBehavior Property="CommandBindings" Value="{StaticResource commandBindings}"/>
</i:Interaction.Behaviors>
...
</Window>
El CollectionSetterBehavior
es un comportamiento reutilizable que no "establece" la propiedad a su valor, sino que borra la colección y vuelve a llenarla. Entonces, la colección no cambia, solo sus contenidos.
Aquí está la fuente de la conducta:
public class CollectionSetterBehavior : Behavior<FrameworkElement>
{
public string Property
{
get { return (string)GetValue(PropertyProperty); }
set { SetValue(PropertyProperty, value); }
}
public static readonly DependencyProperty PropertyProperty =
DependencyProperty.Register("Property", typeof(string), typeof(CollectionSetterBehavior), new UIPropertyMetadata(null));
public IList Value
{
get { return (IList)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(IList), typeof(CollectionSetterBehavior), new UIPropertyMetadata(null));
protected override void OnAttached()
{
var propertyInfo = AssociatedObject.GetType().GetProperty(Property);
var property = propertyInfo.GetGetMethod().Invoke(AssociatedObject, null) as IList;
property.Clear();
foreach (var item in Value) property.Add(item);
}
}
Si no está familiarizado con las conductas, primero Añadir este espacio de nombres:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
y añadir la referencia correspondiente a su proyecto.
Gracias Shou, me Intentaré esto. Supongo que puedo usar nuevos nombres de comando, p. Ej. 'ApplicationCommands.MyCommand'?Si no, esto no responde mi pregunta. – ocodo
También puede usar comandos personalizados. –
Cambie el ejemplo para usar un comando personalizado, no Pegar. No puedo encontrar ninguna otra referencia para agregar nuevos comandos a 'ApplicationCommands', ¿puedes proporcionar un enlace? - Además, ¿mostrarías el uso de XAML, especialmente si difiere de '' - gracias. – ocodo