WPF:在UserControl中实现的Trigger RoutedCommands嵌套在ContentControl中

时间:2014-08-23 17:52:55

标签: wpf user-controls contentcontrol commandbinding routedcommand

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

我基本上有一个外部视图(派生自UserControl),其中包含:

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

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

2)ContentControl。 Content属性绑定到ViewModel,内部视图应该使用它:

<ContentControl x:Name="ViewHost" Content="{Binding InnerViewModel}" />

3)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绑定到ContentControl托管的控件?

如果我将InnerView直接放入OuterView并将Button的CommandTarget设置为InnerView实例,它可以工作:

<Views:InnerView x:Name="InnerViewInstance" />

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

2 个答案:

答案 0 :(得分:1)

试试这个

<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>

我没有测试过,但希望这会对你有所帮助。通过这似乎是一个非常复杂的问题。

答案 1 :(得分:0)

我遇到了这个问题,并了解到我必须为用户控件层次结构中的每个用户控件注册一个命令类型依赖项属性。

我在本网站上了解了另一个link