将按钮的“IsEnabled”属性绑定到具有子元素的“StackPanel”上。

3
我想知道是否可以将我的按钮isEnabled绑定到我的StackPanel Children(有子元素)。如果stackpanel有子元素,则我的按钮启用,没有子元素则禁用。目前我只是在代码中处理这个问题,但我开始想知道是否可以绑定它。感谢任何想法...
3个回答

6

实际上,由于你正在处理布尔值,因此可以反转逻辑并在无需转换器的情况下执行它:

<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>

2

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


那可能是最简单的完成方式,但我在想当你添加子项到堆栈面板时它是否会更新? - Tim
首先,我会直接绑定到子元素。但是,Children不是一个依赖属性,因此它不会更新,因为没有通知有什么变化 :( 所以你需要手动触发更新。 - Daniel Rose

0
一个比 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"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接