如何触发在嵌套在 ContentControl 内的 UserControl 内实现的路由命令?

我基本上拥有的是一个外部 View (派生自 UserControl),其中包含:

1) 应该触发命令 MyCommand 的按钮:
CommandTarget 在这里显然是错误的,因为它应该是托管在 ContentControl 内部的 View ,而不是内容控件本身,因为 CommandBinding 被添加到 InnerView 的 CommandBindings 集合中。

<Button Command="{x:Static Commands:MyCommands.MyCommand}" CommandTarget="{Binding ElementName=ViewHost}">
    Trigger Command
</Button>

2) 一个内容控件。 Content 属性绑定(bind)到内部 View 应该使用的 ViewModel:
<ContentControl x:Name="ViewHost" Content="{Binding InnerViewModel}" />

3) 定义内部 View 类型的 DataTemplate:
<UserControl.Resources>
    <ResourceDictionary>
        <DataTemplate DataType="{x:Type ViewModels:InnerViewModel}">
            <Views:InnerView />
        </DataTemplate>
    </ResourceDictionary>
</UserControl.Resources>

InnerView(派生自 UserControl)在它的 Loaded 事件中设置一个 CommandBinding:
public partial class InnerView : UserControl
{
    private void InnerViewLoaded(object sender, System.Windows.RoutedEventArgs e)
    {
        view.CommandBindings.Add(new CommandBinding(MyCommands.MyCommand, this.ExecuteMyCommand, this.CanExecuteMyCommand));
    }
}

当然还有一个定义命令的类:
internal class MyCommands
{
    static MyCommands()
    {
        MyCommand = new RoutedCommand("MyCommand", typeof(MyCommands));
    }

    public static RoutedCommand MyCommand { get; private set; }
}

我怎样才能让它工作?问题可能是 Button 上的 CommandTarget 是错误的。如何将 CommandTarget 绑定(bind)到 ContentControl 托管的控件?

如果我将 InnerView 直接放入 OuterView 并将按钮的 CommandTarget 设置为 InnerView 实例,它会起作用:
<Views:InnerView x:Name="InnerViewInstance" />

<Button Command="{x:Static Commands:MyCommands.MyCommand}" CommandTarget="{Binding ElementName=InnerViewInstance}">
    Trigger Command
</Button>

最佳答案

试试这个

<UserControl.Resources>
<ResourceDictionary>
    <Views:InnerView x:Key="innerView"/>
    <DataTemplate DataType="{x:Type ViewModels:InnerViewModel}">
        <ContentControl Content="{StaticResource innerView}" />
    </DataTemplate>
</ResourceDictionary>
<Button Command="{x:Static Commands:MyCommands.MyCommand}" CommandTarget="{StaticResource innerView}">
        Trigger Command
    </Button>
我还没有测试过,但希望这会帮助你。尽管这似乎是一个非常复杂的问题。

关于WPF:触发 RoutedCommands 在嵌套在 ContentControl 中的 UserControl 中实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25464759/

10-11 00:49