2016-07-21 11 views
1

ControlControlのButtonコマンドをCustomControlのExecute()メソッドにバインドします。私はRoutedCommandを使用していますが、CanExecute()は起動しますが、Execute()は決して実行しません。 CustomControlをメインウィンドウに配置すると、コードは期待通りに機能します。それがUsercontrolに配置されるとき、私はこの問題があります。私はボタンコマンド(RelayCommandなど)を結ぶいくつかの方法を試しましたが、何が間違っているのか分からないようです。どんな助けもありがとうございます。CustomControlのコマンドバインディングの問題:CanExecute()が発生し、Execute()が発生しない

コンテキストの場合、これは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から継承されます。

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

最後にCanDeleteだけtrueにCanExecuteを設定します: - 省略機能は、署名がある

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

そしてDeleteTokenは非静的コンストラクタでは、我々はDeleteTokenメソッドに静的な削除コマンドをアップ配線します実際には重要なのはここだけです:

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

これは、ガイダンス/提案の提供に興味がある人にとっては十分な情報です。ありがとう。

答えて

0

私はPluralsightを通してメンターを雇ったのでここではほとんど興味がありません。バインディングは正しいものの、CustomControlにはマウスクリックをキャプチャしていたRichTextBoxがありました。 ButtonのPreviewMouseDownをターゲットにした動作を使用して問題を修正しました。

関連する問題