2009-06-21 194 views
3

如何在样式(或其他方法)中使用属性触发器来更改已通过绑定定义其属性值的属性(例如ToolTip)?使用属性触发器更改已具有绑定属性

我有这样一个简单的按钮,以便:

<Button Name="Button1" Style="{StaticResource ButtonStyle}" 
     ToolTip="{Binding Name}" >My Button</Button> 

它在提示绑定,以显示设置的DataContext类的名称属性。

我的问题是我想显示名称,当按钮被启用,但其他东西时,它被禁用。我以为我可以避开我的问题与风格和触发器像这样:

<Style TargetType="Button" x:Key="ButtonStyle"> 
    <Setter Property="ToolTipService.ShowOnDisabled" Value="True" /> 
    <Style.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="ToolTip" Value="Disabled" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

但是,这是行不通的。如果我从按钮中删除了工具提示绑定,那么当按钮被禁用时,我会得到正确的工具提示。但似乎我不能同时拥有绑定和触发器。

我能避开它通过添加另一个触发像这样:

<Trigger Property="IsEnabled" Value="true"> 
    <Setter Property="ToolTip" Value="{Binding Name}" /> 
</Trigger> 

但我想使用的样式为4个或5个按钮,将所有有启用工具提示不同的绑定,但相同的(固定)工具提示,当他们被禁用。

有什么建议吗?

回答

3

问题的最简单的解决方案是创建一个按钮样式,让所有按钮都可以使用(下例中的_DisabledButtonToolTipStyle),然后为每个应用了启用的工具提示值的按钮定义一个独特的样式。如果单个按钮总是有不同的工具提示值,那么我建议只需嵌入下面的样式;但是,如果您想重用已启用的工具提示样式,则可以在资源中轻松定义它,并为其提供一个键。

<Window.Resources> 
    <Style x:Key="_DisabledButtonToolTipStyle" TargetType="Button"> 
     <Setter Property="ToolTipService.ShowOnDisabled" Value="True" /> 
     <Style.Triggers> 
      <Trigger Property="IsEnabled" Value="false"> 
       <Setter Property="ToolTip" Value="Disabled" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

<Grid> 
    <Button Name="Button1" Content="My Button"> 
     <Button.Style> 
      <Style TargetType="Button" BasedOn="{StaticResource _DisabledButtonToolTipStyle}"> 
       <Setter Property="ToolTip" Value="{Binding Name}" /> 
      </Style> 
     </Button.Style> 
    </Button> 
</Grid> 
2

您的问题无关的结合,问题是,你直接设置元素的属性会覆盖在样式设置的属性,例如:

中给出的风格

<Style TargetType="Button"> 
    <Setter Property="Background" Value="Blue"/> 
</Style> 

而且这两个按钮:

<Button Content="1st"/> 
<Button Content="2nd" Background="Red"/> 

的第一个按钮会得到其来自风格的背景,但第二个覆盖风格背景。

你可以得到你想要的触发器什么,但没有使用样式,您可以使用这样一个DataTemplate(文本框和CheckBox是否有用于测试):

<ContentPresenter Content="{Binding}"> 
    <ContentPresenter.ContentTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBox Name="edt" Text="Tooltip text"/> 
       <Button Name="btn" Content="x" 
        ToolTip="{Binding ElementName=edt, Path=Text}" 
        ToolTipService.ShowOnDisabled="True"/> 
       <CheckBox Content="Enabled" 
        IsChecked="{Binding ElementName=btn, Path=IsEnabled}"/> 
      </StackPanel> 
      <DataTemplate.Triggers> 
       <Trigger SourceName="btn" Property="IsEnabled" Value="False"> 
        <Setter TargetName="btn" Property="ToolTip" Value="Disabled"/> 
       </Trigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </ContentPresenter.ContentTemplate> 
</ContentPresenter> 
相关问题