使用属性触发器更改已具有绑定的属性

时间:2009-06-21 21:10:43

标签: wpf data-binding triggers

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

我有一个简单的按钮:

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

它在工具提示上有一个绑定,用于显示设置为DataContext的类的Name属性。

我的问题是我想在启用按钮时显示名称,但在禁用按钮时显示其他内容。我认为我可以通过样式和触发器来解决我的问题:

<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个按钮的样式,它们对启用的工具提示都有不同的绑定,但是当它们被禁用时会有相同的(固定的)工具提示。

有什么建议吗?

2 个答案:

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

答案 1 :(得分:2)

您的问题与绑定无关,问题是您直接在元素上设置的属性会覆盖样式中设置的属性,例如:

鉴于风格

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

这两个按钮:

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

第一个按钮将从样式中获取其背景,但第二个按钮将覆盖样式背景。

你可以使用触发器但不使用样式获得你想要的东西,你可以使用像这样的DataTemplate(TextBox和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>