【问题标题】:Use a property trigger to change a property that already has a binding使用属性触发器更改已绑定的属性
【发布时间】:2010-11-04 17:11:24
【问题描述】:

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

我有一个像这样的简单按钮:

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

它在工具提示上有一个绑定,将类的 Name 属性显示为 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 个按钮使用该样式,它们对启用的 ToolTip 都有不同的绑定,但在禁用时使用相同(固定)的工具提示。

有什么建议吗?

【问题讨论】:

    标签: wpf data-binding triggers


    【解决方案1】:

    解决问题的最简单方法是创建一个所有按钮都可以使用的按钮样式(以下示例中的_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(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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-10
        • 2012-09-03
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        相关资源
        最近更新 更多