【问题标题】:How do I bind to another control's property from a trigger?如何从触发器绑定到另一个控件的属性?
【发布时间】:2011-02-01 00:07:51
【问题描述】:

在我的特定情况下,我想绑定到 TextBox 的 IsReadOnly 属性以设置 Button 的 Content 属性?它们都是同一个 StackPanel 的一部分。

我已经尝试使用绑定到 TextBox 的 ElementName 的 DataTrigger 和使用 TextBox 名称作为 SourceName 的触发器来执行此操作。

有什么想法吗?

【问题讨论】:

    标签: wpf xaml triggers styles


    【解决方案1】:

    您需要将触发器指定为样式的一部分——Button 本身的 Triggers 集合只能包含事件触发器。考虑到这一点,DataTrigger 可以正常工作。但是,有一个问题:Trigger Setter 的值不会覆盖本地 Content 属性。因此,您还必须在样式中设置默认内容。下面是它的外观:

    <Button>  <!-- Note no content set directly on button -->
      <Button.Style>
        <Style TargetType="Button">
          <Setter Property="Content" Value="You may write!!!" />  <!-- Here is the 'normal' content -->
          <Style.Triggers>
            <!-- Here is how we bind to another control's property -->
            <DataTrigger Binding="{Binding IsReadOnly, ElementName=textBox}" Value="True">
              <Setter Property="Content" Value="NO NO NO" />  <!-- Here is the 'override' content -->
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </Button.Style>
    </Button>
    

    【讨论】:

    • 啊哈!我知道有一个属性优先级,但我没有想到直接会覆盖触发操作。我使用 DP 作为绑定源,结果与尝试使用 ElementName 一样缺乏行为,因此问题实际上出在属性优先级上。感谢您清除它!
    • 这很好。正是我所需要的,我几乎要编写一个转换器。但这更好。
    • > 但是,有一个问题:Trigger Setter 的值不会覆盖本地 Content 属性。这个很重要 !我第一次阅读这个答案时错过了它。
    • 是否有关于这些事情的 MSFT 文档?例如,如何使触发器影响向上或向下方向的其他元素,或者关于覆盖?
    【解决方案2】:

    你试过了吗:

    <StackPanel x:Name="LayoutRoot">
        <Button Width="75" Content="{Binding IsReadOnly, ElementName=textBox, Mode=Default}" />
        <TextBox x:Name="textBox" VerticalAlignment="Top" Text="TextBox" />
    </StackPanel>
    

    ??

    【讨论】:

    • 他可能希望他的按钮说一些比 True 或 False 更有意义的东西,尽管 *grin*。当然,您可以通过插入转换器来做到这一点,但触发器确实感觉更惯用......
    • 马克,我编辑了你的代码,去掉了一些我觉得很难看到你建议的核心的无关部分。希望这没问题 - 如果您觉得我扭曲了您的意图,请回滚。
    • 那很好,谢谢你,我只是很快把它弄好了,可能应该把它清理干净:)
    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2015-07-12
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    相关资源
    最近更新 更多