1)使用CommandBindings自定义DataGrid。
2)RoutedCommand定义。
3)命令目标定义。 (XAML)
CS:
//(1)
public class CustomDataGrid : DataGrid
{
this.CommandBindings.Add(new CommandBinding(Commands.ClearInputCommand,
ClearFilter, ClearFilterCanExecute));
}
//(2)
public static class Commands
{
public static RoutedCommand ClearInputCommand = new RoutedCommand("ClearInputCommand", typeof(Commands));
}
XAML:
<!-- (3) -->
<local:CustomDataGrid x:Name="grid" />
<Button Command="{x:Static p:Commands.ClearInputCommand}"
CommandTarget="{Binding ElementName=grid}"/>
我想将CommandBindings传递给我的CustomDataGrid的子节点(它的模板中的一个元素),从而消除了对这个“自定义”DataGrid的需求,并且只改变了常规DataGrid的模板。
XAML:CustomDataGridTemplate。
<Template TargetType="{x:Type p:CustomDataGrid}" >
......
<p:SomeCustomElement x:Name="I WANT TO BE THE COMMAND TARGET !" />
......
</Template>
我怎样才能做到这一点?有没有注册SomeCustomElement到该命令?
答案 0 :(得分:0)
好的,所以在所有类型的RoutedCommands中,我放置了一些扩展方法,用自己的类型注册路由命令,
public static class Commands
{
public static RoutedCommand ClearInputCommand = new RoutedCommand("ClearInputCommand", typeof(Commands));
public static void RegisterCommand(this UIElement uiElement, RoutedCommand command, ExecutedRoutedEventHandler execute, CanExecuteRoutedEventHandler canExecute = null)
{
uiElement.RegisterCommand(new CommandBinding(command, execute, canExecute));
}
public static void RegisterCommand(this UIElement uiElement, CommandBinding commandBinding)
{
CommandManager.RegisterClassCommandBinding(typeof(object), commandBinding);
}
public static void UnRegisterCommand(this UIElement uiElement, RoutedCommand command)
{
for (int i = 0; i < uiElement.CommandBindings.Count; i++)
{
CommandBinding c = uiElement.CommandBindings[i];
if (c.Command == command)
{
uiElement.CommandBindings.RemoveAt(i);
}
}
}
public static void UnRegisterCommand(this UIElement uiElement, CommandBinding commandBinding)
{
uiElement.CommandBindings.Remove(commandBinding);
}
}
然后只是从该类的构造函数中调用它,我不确定是否需要取消注册这一点很困难,在我看来这会导致内存泄漏,因为它包含对Execute和CanExecute委托的引用。
为了取消注册它们,我必须跟踪所有注册的uielements并清除应用程序关闭时的CommandBindings。
我认为更好的解决方案是使用像棱镜CompositeCommand这样的东西。但现在这样做。