如果你尝试在你的 中定义CommandBindings
orInputBindings
作为资源App.xaml
,你会发现你不能使用它们,因为 XAML 不允许你使用:
<Window ... CommandBindings="{StaticResource commandBindings}">
或使用样式设置器设置命令绑定:
<Setter Property="CommandBindings" Value="{StaticResource commandBindings}">
因为这些属性都没有“set”访问器。使用这篇文章中的想法,我想出了一种干净的方式来使用来自App.xaml
或任何其他资源字典的资源。
首先,您间接定义命令绑定和输入绑定,就像您定义任何其他资源一样:
<InputBindingCollection x:Key="inputBindings">
<KeyBinding Command="Help" Key="H" Modifiers="Ctrl"/>
</InputBindingCollection>
<CommandBindingCollection x:Key="commandBindings">
<CommandBinding Command="Help" Executed="CommandBinding_Executed"/>
</CommandBindingCollection>
然后你从另一个类的 XAML 中引用它们:
<Window ...>
<i:Interaction.Behaviors>
<local:CollectionSetterBehavior Property="InputBindings" Value="{StaticResource inputBindings}"/>
<local:CollectionSetterBehavior Property="CommandBindings" Value="{StaticResource commandBindings}"/>
</i:Interaction.Behaviors>
...
</Window>
这CollectionSetterBehavior
是一种可重用的行为,它不会将属性“设置”为其值,而是清除集合并重新填充它。所以集合没有改变,只有内容。
这是行为的来源:
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);
}
}
如果您不熟悉行为,请先添加此命名空间:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
并将相应的引用添加到您的项目中。