WPF: Trigger RoutedCommands, реализованные в UserControl, вложенные в ContentControl

Как я могу запустить перенаправленные команды, реализованные в UserControl, который вложен в ContentControl?

То, что я в основном имею, это внешний вид (производный от UserControl), который содержит:

1) Кнопка, которая должна вызывать команду MyCommand: здесь явно не указывается CommandTarget, так как это должно быть представление, которое размещено внутри ContentControl, а не сам элемент управления содержимым, поскольку CommandBinding добавляется в коллекцию CommandBindings InnerView.

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

2) Контент-контроль. Свойство 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) устанавливает CommandBinding в событие Loaded:

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

Как я могу заставить это работать? Возможно, проблема в том, что CommandTarget на кнопке неверен. Как я могу связать CommandTarget с элементом управления, размещенным в ContentControl?

Если я помещаю InnerView непосредственно в OuterView и устанавливаю CommandTarget для Button в экземпляре InnerView, он работает:

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

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

2 ответа

Попробуй это

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

Я не проверял это, но надеюсь, что это поможет вам. хотя это кажется очень сложной проблемой.

Я столкнулся с этой проблемой и узнал, что мне нужно зарегистрировать свойство зависимости типа команды для каждого пользовательского элемента управления в моей иерархии пользовательских элементов управления.

Я узнал об этом еще одна моя ссылка на этом сайте.

Другие вопросы по тегам