Проблема привязки команд в CustomControl: CanExecute() срабатывает, Execute() не

Я связываю команду кнопки в ControlTemplate с методом Execute() в CustomControl. Я использую RoutedCommand, CanExecute() срабатывает, но Execute() никогда не делает. Когда CustomControl размещен в главном окне, код работает как положено. Когда он помещается в Usercontrol, у меня возникает эта проблема. Я пробовал несколько способов подключить кнопки Command (RelayCommand и т. Д.), Но не могу понять, что не так. Любая помощь приветствуется.

Для контекста это элемент управления TokenizingTextBox - ранняя ветвь версии с открытым исходным кодом Xceed. Кнопка предназначена для удаления токена из списка токенов.

Полный стиль TokenIten (который содержит интересующую кнопку):

    <Style TargetType="{x:Type local:TokenItem}">
      <Setter Property="Background" Value="#F3F7FD" />
      <Setter Property="BorderBrush" Value="#BBD8FB" />
      <Setter Property="BorderThickness" Value="1" />
      <Setter Property="Cursor" Value="Arrow" />
      <Setter Property="Padding" Value="2,1,1,1" />
      <Setter Property="Margin" Value="1,0" />
      <Setter Property="Template">
         <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:TokenItem}">
               <Border Background="{TemplateBinding Background}"
                       BorderBrush="{TemplateBinding BorderBrush}"
                       BorderThickness="{TemplateBinding BorderThickness}"
                       Padding="{TemplateBinding Padding}"
                       CornerRadius="0,0,5,5"
                       Margin="{TemplateBinding Margin}"
                       >
                        <StackPanel Orientation="Horizontal" Margin="1" x:Name="myRoot">
                            <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" />

                            <Button Margin="3,0,0,0" Cursor="Hand" 
                                    Command="{x:Static local:TokenizedTextBoxCommands.Delete}" CommandParameter="{TemplateBinding TokenKey}" 
                                    PresentationTraceSources.TraceLevel="High">
                        <!--<Button.Template>
                           <ControlTemplate TargetType="Button">
                              <ContentPresenter />
                           </ControlTemplate>
                        </Button.Template>-->
                        <Image Source="/Resources/delete8.png" Width="8" Height="8" />
                     </Button>
                  </StackPanel>
               </Border>
            </ControlTemplate>
         </Setter.Value>
      </Setter>
   </Style>    

Статическая команда:

  public static class TokenizedTextBoxCommands
  {
    private static RoutedCommand _deleteCommand = new RoutedCommand();

    public static RoutedCommand Delete => _deleteCommand;
  }

Пользовательский элемент управления наследуется от ItemsControl. В нестатическом конструкторе мы подключаем статическую команду удаления к методу DeleteToken:

public TokenizedTextBox()
{
    CommandBindings.Add(new CommandBinding(TokenizedTextBoxCommands.Delete, DeleteToken, CanDelete));
}

Наконец, CanDelete, который просто устанавливает CanExecute в true:

    private void CanDelete(object sender, CanExecuteRoutedEventArgs canExecuteRoutedEventArgs)
    {
        canExecuteRoutedEventArgs.CanExecute = true;
    }

И DeleteToken - функциональность опущена, подпись здесь действительно важна:

    private void DeleteToken(object sender, ExecutedRoutedEventArgs e)
    {
        ...
    }

Так что, надеюсь, этой информации будет достаточно для тех, кто заинтересован в предоставлении рекомендаций / предложений. Благодарю.

1 ответ

Небольшой интерес здесь, поэтому я нанял наставника через Pluralsight. Привязки были правильными, но CustomControl имел RichTextBox, который захватывал щелчок мыши. Мы исправили проблему с помощью Поведения, нацеленного на PreviewMouseDown кнопки.

Другие вопросы по тегам