WPF / Silverlight:如何将命令添加到修改后的控件模板?

时间:2011-08-05 18:14:46

标签: c# wpf silverlight xaml

我已覆盖我正在使用的某个第三方控件的控件模板:

所以

<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类。所以我希望这个命令可以存在于我生成的文件中,这甚至可能吗?

3 个答案:

答案 0 :(得分:0)

此命令来自模板化父级,即Some3rdPartyControl ...

您的Some3rdPartyControl中是否包含Command类型的depepdency属性?如果是,那么你可以TemplateBinding

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

否则,您必须为Some3rdPartyControl创建一个Command类型附加属性,并将其用于TemplateBinding到Button。

    <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>

现在,在实施Some3rdPartyControl时,请执行此操作...

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

CommandFromDataContextViewModel是您的自定义命令。由于TemplateBinding它到达Button,当Button单击happnes时,执行此CommandFromDataContextViewModel命令。

这会回答你的问题吗?

答案 1 :(得分: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>

答案 2 :(得分:0)

您想要UserControl的命令属性还是静态命令定义?

如果需要Command属性,例如Button.Command属性,则需要在UserControl后面的代码中创建自己的命令定义。查找为此创建自己的自定义DependencyProperty。执行的命令将“存活”在您的DataContext中,并且XAML代码看起来像这样:

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

如果它将是一个静态命令定义,如CopyPaste命令,则需要在XAML可以访问的某处创建静态ICommand,并将XAML绑定到像这样的东西:

<Button Command="{x:Static local:SomeCustomCommand}" />