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>
Я не проверял это, но надеюсь, что это поможет вам. хотя это кажется очень сложной проблемой.
Я столкнулся с этой проблемой и узнал, что мне нужно зарегистрировать свойство зависимости типа команды для каждого пользовательского элемента управления в моей иерархии пользовательских элементов управления.
Я узнал об этом еще одна моя ссылка на этом сайте.