Как я могу запускать перенаправленные команды, реализованные внутри 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>