wpf user-controls contentcontrol commandbinding routedcommand

WPF: Trigger RoutedCommands implementados en UserControl anidados dentro de ContentControl



user-controls commandbinding (2)

Prueba esto

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

No lo he probado pero espero que esto te ayude. aunque esto parece un problema muy complejo.

¿Cómo puedo activar comandos enrutados implementados dentro de un UserControl que está anidado dentro de un ContentControl?

Lo que básicamente tengo es una vista externa (derivada de UserControl) que contiene:

1) Un botón que debe activar el comando MyCommand: Obviamente, CommandTarget está equivocado, ya que debe ser la vista alojada dentro de ContentControl, y no el control de contenido en sí, ya que CommandBinding se agrega a la colección CommandBindings de InnerView.

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

2) Un control de contenido. La propiedad Content está vinculada al ViewModel que debería ser utilizado por la vista interna:

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

3) Un DataTemplate que define el tipo de la vista interna:

<UserControl.Resources> <ResourceDictionary> <DataTemplate DataType="{x:Type ViewModels:InnerViewModel}"> <Views:InnerView /> </DataTemplate> </ResourceDictionary> </UserControl.Resources>

InnerView (derivado de UserControl) establece un CommandBinding en su evento 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)); } }

Y, por supuesto, una clase que define el comando:

internal class MyCommands { static MyCommands() { MyCommand = new RoutedCommand("MyCommand", typeof(MyCommands)); } public static RoutedCommand MyCommand { get; private set; } }

¿Cómo puedo hacer que esto funcione? El problema es probablemente que CommandTarget on the Button sea incorrecto. ¿Cómo puedo vincular CommandTarget al control alojado por ContentControl?

Si pongo InnerView directamente en OuterView y establezco CommandTarget del botón en la instancia de InnerView, funciona:

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


Me encontré con este problema y me enteré de que tenía que registrar una propiedad de dependencia de tipo de comando para cada control de usuario dentro de mi jerarquía de control de usuario.

Aprendí este mi otro enlace en este sitio.