C# 如何从子控件使用Command.CanExecute

C# 如何从子控件使用Command.CanExecute,c#,.net,wpf,command,C#,.net,Wpf,Command,以下是设置(删除了无关的布局代码): Window.xaml <Button Name="btn_Next" Command="NextPage">Next</Button> <ContentControl Name="contentControl1" > <Binding ElementName="MainWindow" Path="CurrentPage"/> </ContentControl> 这在基本示例中非常

以下是设置(删除了无关的布局代码):

Window.xaml

<Button Name="btn_Next" Command="NextPage">Next</Button>
<ContentControl Name="contentControl1" >
        <Binding ElementName="MainWindow" Path="CurrentPage"/>
</ContentControl>
这在基本示例中非常有效,
nextCommand\u CanExecute
检查当前页面是否是最后一页。但是,该逻辑目前仅用于检查阵列,并且仅适用于线性导航。但是,导航将是树状的,这将不起作用,
contentControl1
中的项目有时会向不同的方向分支。因此,我希望用户控件即
CurrentPage
有机会覆盖
CanExecute
。我的问题是我不知道如何让
UserControl
启动
CanExecute
。我尝试过使用大量的
CommandTarget
设置,但没有效果……我的子控件从未触发过它的
CanExecute
方法。我甚至尝试在父窗口的CanExecute中使用
e.ContinueRouting=true
。以下是用户控制代码,以防有所帮助

用户控制构造函数:

  var nextCommand = new CommandBinding(NavigationCommands.NextPage);
  nextCommand.CanExecute += nextCommand_CanExecute;
  CommandBindings.Add(nextCommand);
用户控件CanExecute方法:

private void nextCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
  e.CanExecute = false;
  e.Handled = true;
}

路由命令事件隧道从可视树的根向下到启动它们的控件,然后返回气泡。Josh Smith关于routed命令的文章很好地总结了它的工作原理(具体请参见“routed”一节)

这里的问题是,您的用户控件(在内容控件内部)不是发出命令的按钮的“祖先”,因此路由事件永远不会到达它(即使在传递过程中)。考虑到可视化树的结构方式,我认为路由命令对您来说是不够的


想到的第一个解决方案是装配您自己的机制,将CanExecute/Executed逻辑委托给您的用户控件。也许您可以定义一个基类或接口,该基类或接口由所有此类控件实现,这些控件定义了所需的各种命令执行/执行方法。然后,您可以使用一个顶级实现,将当前加载的控件转换为接口/基类类型,并调用相应的方法。

Darn,这就是我想我可能必须要做的…我希望已经有了一些内置的东西。我想让内置的东西工作的唯一方法是在用户控件中放置导航按钮,这看起来对你不起作用。
private void nextCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
  e.CanExecute = false;
  e.Handled = true;
}