2011-08-05 11 views
0

私が使用している特定のサードパーティ製のコントロールのためのコントロールテンプレートをオーバーライドしていますWPF/Silverlight:変更されたコントロールテンプレートにコマンドを追加する方法は?

ので

<Style TargetType="Some3rdPartyControl"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Some3rdPartyControl"> 
     <Grid> 
     ...alot of stuff.. 
     </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

基本的に、私はコントロールテンプレート内のボタンを追加しました:

<Style TargetType="Some3rdPartyControl"> 
<Setter Property="Template"> 
<Setter.Value> 
    <ControlTemplate TargetType="Some3rdPartyControl"> 
    <Grid> 
    <Button x:Name="myButton" Width="20" Height="20"> 
    ...alot of stuff.. 
    </Grid> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

基本的には、私はイベントをフックしたいと思います。おそらく、この新しいボタンのコマンドは間違っています...どうすればいいですか?どのタイプのコマンドですか、それはどこに住んでいますか?私はこの第三者コントロールの実際の.csクラスにアクセスすることはできません。このコマンドが生成するファイルのどこかにこのコマンドが存在することが期待されますが、これも可能ですか?

答えて

0

このコマンドは、テンプレートの親すなわちSome3rdPartyControlから来ている...

はあなたのSome3rdPartyControlはそれでCommand型depepdencyプロパティを持っていますか?はいの場合は、それにTemplateBindingを行うことができます。エルス

 <Button x:Name="myButton" Command="{TemplateBinding Command}" Width="20" Height="20"> 

あなたSome3rdPartyControlにコマンドタイプ添付プロパティを作成して、ボタンにTemplateBindingにそれを使用する必要があります。 ...これを行う

<Some3rdPartyControl myNamespace:MyAttachedBehavior.MyAttachedCommand="{Binding CommandFromDataContextViewModel}" /> 

をごSome3rdPartyControlを実装しながら、

<Style TargetType="Some3rdPartyControl"> 
     <Setter Property="Template"> 
      <Setter.Value> 
      <ControlTemplate TargetType="Some3rdPartyControl"> 
       <Grid> 
       <Button x:Name="myButton" Width="20" Height="20" Command="{TemplateBinding myNamespace:MyAttachedBehavior.MyAttachedCommand}"> 
        ...alot of stuff.. 
       </Grid> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

今CommandFromDataContextViewModelは、カスタムコマンドがあります。 TemplateBindingによりButtonに到達し、Buttonがhappesをクリックすると、このCommandFromDataContextViewModelコマンドが実行されます。

これはあなたの質問にお答えしますか?

+0

は、私は非常にあなたの最初の例のコマンドを理解していない=「{TemplateBindingのコマンド}」...私は起動したいです私自身のカスタムコマンドでこれがどのように達成されるでしょうか? – foreyez

+0

私は自分の答えを編集しました。代わりに2番目のオプションを使用してください...今度は、あなたのcustmomコマンドをTemplateBindingを使ってButtonに対してどのように指定できるかを説明します。 –

0

あなたのViewModelににあなたのコマンドを持つことができ、このように結合するための単純RealtiveSourceを使用してボタンにそのコマンドをバインドすることができます -

<Style TargetType="Some3rdPartyControl"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Some3rdPartyControl"> 
     <Grid> 
     <Button x:Name="myButton" Width="20" Height="20" 
Command="{Binding DataContext.YourCommandName, RelativeSource={RealtiveSource FindAncestor, AncestorType={x:Type UserControl}}}"> 
     ...alot of stuff.. 
     </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
0

あなたのユーザーコントロールのためのコマンドプロパティをしたいか、または静的コマンド定義? プロパティなどのコマンドプロパティが必要な場合は、独自のコマンド定義をUserControlの背後にあるコードで作成する必要があります。あなた自身のカスタムDependencyPropertyを作成してください。あなたがする必要がある、CopyまたはPasteコマンドのように、静的コマンド定義になるだろう場合

<local:MyCustomControl SomeCustomCommand="{Binding SomeCommand}" /> 

:実行されますコマンドは、あなたのDataContextだったとXAMLコードは次のようになります何で「ライブ」だろうXAMLがアクセスできるどこかの静的ICommandを作成し、このようなものでXAMLをバインド:

<Button Command="{x:Static local:SomeCustomCommand}" /> 
関連する問題