我想知道是否可以将我的按钮isEnabled绑定到我的StackPanel Children(有子元素)。如果stackpanel有子元素,则我的按钮启用,没有子元素则禁用。目前我只是在代码中处理这个问题,但我开始想知道是否可以绑定它。感谢任何想法...
实际上,由于你正在处理布尔值,因此可以反转逻辑并在无需转换器的情况下执行它:
<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>
您可以编写一个简单的ValueConverter来为您执行该逻辑。将按钮的IsEnabled绑定到StackPanel上,在您的值转换器中检查它是否有任何子元素,然后返回true/false。
ItemsPanel
)可能是绑定到 StackPanel
的 ActualHeight
属性,因为如果没有子元素,它的大小将为 0。<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=sp, Path=ActualHeight}" Value="0">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
如果StackPanel
不能正确收缩,您可能需要使用VerticalAlignment="Top"
。