RoutedCommand в UserControl не работает должным образом - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь использовать RoutedCommands в моем UserControls, вдохновленном этой статьей Джоша Смита.

https://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/

Я сделал это несколько иначе, чем в примере в статье, и определил RoutedCommand и CommandBindings в Usercontrol.

Теперь я пытаюсь использовать его в моем главном окне. Чтобы при нажатии на кнопку, команда в UserControl была выполнена. К сожалению, я получаю отключенную кнопку.

Метод Foo_CanExecute() никогда не выполняется.

<UserControl x:Class="RoutedCommandTest.ViewControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:RoutedCommandTest"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.CommandBindings>
        <CommandBinding
            Command="{x:Static local:ViewControl.Foo}"
            PreviewCanExecute="Foo_CanExecute"
            PreviewExecuted="Foo_Executed"
        />
    </UserControl.CommandBindings>
    <Grid>

    </Grid>
</UserControl>

В ViewControl.xaml.cs

    public static readonly RoutedCommand Foo = new RoutedCommand();

    void Foo_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

    void Foo_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        MessageBox.Show("The Window is Fooing...");
    }

    public ViewControl()
    {
        InitializeComponent();
    }

В MainWindow.xaml:

<Window x:Class="RoutedCommandTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:RoutedCommandTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <local:ViewControl/>
        <Button Content="Foo" Margin="0 5" Command="{x:Static local:ViewControl.Foo}"/>
    </Grid>
</Window>

1 Ответ

2 голосов
/ 26 мая 2019

Ваша команда находится в пользовательском контроле, в то время как кнопка находится в главном окне.

Который, по-видимому, содержит ваш пользовательский контроль.

Как события пузырьков и маршрутизации (которые используются для их управления).

Выполняется, ищет команду, восходящую к визуальному дереву до привязки.

PreviewExecuted ищет команду туннелирования ВНИЗ, визуальное дерево к привязке.

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

Но туннелирование будет PreviewExecuted и PreviewCanExecute.

https://docs.microsoft.com/en-us/dotnet/api/system.windows.input.commandbinding.previewexecuted?view=netframework-4.8

https://docs.microsoft.com/en-us/dotnet/api/system.windows.input.commandbinding.previewcanexecute?view=netframework-4.8

Команды с маршрутизацией могут быть довольно сложными для получения правильного результата.

Одна вещь, которую вам иногда нужно сделать, это связать commandtarget, чтобы указать, куда искать.

Например:

    <Grid>
      <local:UserControl1 x:Name="UC1" Height="60" Width="100"/>
      <Button Content="Foo" TextElement.FontSize="30" Command="{x:Static local:UserControl1.Foo}"
              CommandTarget="{Binding ElementName=UC1}"
              />
    </Grid> 

Работает для меня.

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

...