【问题标题】:Binding Button IsEnabled to StackPanel has Children将按钮 IsEnabled 绑定到 StackPanel 有子项
【发布时间】:2011-08-26 18:20:25
【问题描述】:

我想知道是否可以将我的 Button isEnabled 绑定到我的 StackPanel Children(有孩子)。如果堆栈面板有孩子,那么我的按钮被启用,没有孩子我的按钮被禁用。目前我只是在代码中处理这个,但我开始想知道这是否是我可以绑定的。感谢您的任何想法...

【问题讨论】:

    标签: wpf button binding stackpanel isenabled


    【解决方案1】:

    比 H.B. 更简单的解决方案(不需要 ItemsPanel)可能是绑定到 StackPanelActualHeight 属性,因为如果没有孩子,它的大小将为 0。

    <Style.Triggers>
      <DataTrigger Binding="{Binding ElementName=sp, Path=ActualHeight}" Value="0">
        <Setter Property="IsEnabled" Value="False"/>
      </DataTrigger>
    </Style.Triggers>
    

    如果StackPanel 不能正确收缩,您可能必须使用VerticalAlignment="Top"

    【讨论】:

      【解决方案2】:

      实际上,由于您处理的是布尔值,因此您可以反转逻辑并在没有转换器的情况下进行:

      <StackPanel Name="sp" />
      <Button Content="A Button">
          <Button.Style>
              <Style TargetType="{x:Type Button}">
                  <Style.Triggers>
                      <DataTrigger Binding="{Binding ElementName=sp, Path=Children.Count}" Value="0">
                          <Setter Property="IsEnabled" Value="False"/>
                      </DataTrigger>
                  </Style.Triggers>
              </Style>
          </Button.Style>
      </Button>
      

      由于Children.Count 不是 DP,使用它会在获取更新方面遇到一些问题,但您可以使用ItemsControl 来解决这个问题(默认情况下它的行为类似于StackPanel):

      <ItemsControl Name="ic" />
      <Button Content="A Button">
          <Button.Style>
              <Style TargetType="{x:Type Button}">
                  <Style.Triggers>
                      <DataTrigger Binding="{Binding ElementName=ic, Path=Items.Count}" Value="0">
                          <Setter Property="IsEnabled" Value="False"/>
                      </DataTrigger>
                  </Style.Triggers>
              </Style>
          </Button.Style>
      </Button>
      

      【讨论】:

        【解决方案3】:

        您可以编写一个简单的 ValueConverter 来为您执行该逻辑。将按钮的 IsEnabled 绑定到 StackPanel 并在您的值转换器中检查它是否有任何子项,然后返回 true/false。

        【讨论】:

        • 这可能是完成它的最简单方法,不过我想知道当您将子项添加到堆栈面板时它是否会更新?
        • 首先,我会直接绑定到孩子。但是,Children 不是依赖属性,因此它不会更新,因为没有通知更改某些内容:(因此您必须手动触发更新。
        猜你喜欢
        • 2015-07-12
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多