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) 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) устанавливает 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 кнопки на экземпляр InnerView, он работает:

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

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

person devar    schedule 23.08.2014    source источник


Ответы (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>

I havent tested it but hope this will help you. though this seems a very complex issue.

person yo chauhan    schedule 23.08.2014
comment
Кажется, это работает. Но, в конце концов, это все равно, что поместить InnerView непосредственно в OuterView. В любом случае, спасибо :-) - person devar; 24.08.2014
comment
да, в противном случае я не думаю, что есть способ сослаться на элемент datatemplate в xaml. - person yo chauhan; 24.08.2014
comment
Вы не можете заменить InnerView динамически. stackoverflow.com/questions/19864891/ - person devar; 24.08.2014

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

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

person Scott Nimrod    schedule 14.11.2014