Мне интересно, могу ли я связать свою кнопку isEnabled с моими детьми StackPanel (имеет детей). Если у стековой панели есть дочерние элементы, моя кнопка включена, а дочерние элементы моей кнопки отключены. В настоящее время я просто обрабатываю это в коде, но мне стало интересно, можно ли это связать. Спасибо за любые мысли...
Кнопка привязки IsEnabled к StackPanel имеет дочерние элементы
Ответы (3)
На самом деле, поскольку вы имеете дело с логическим значением, вы можете инвертировать логику и сделать это без преобразователей:
<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
), чем HB, может быть связано со свойством ActualHeight
StackPanel
, поскольку его размер будет равен 0, если нет дочерних элементов.
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=sp, Path=ActualHeight}" Value="0">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
Возможно, вам придется использовать VerticalAlignment="Top"
для StackPanel
, если он не сжимается должным образом.