Die Bindung von Button IsEnabled an StackPanel hat untergeordnete Elemente
-
14-11-2019 - |
Frage
Ich frage mich, ob ich meinen Button isEnabled an meine StackPanel-Kinder binden kann (hat Kinder).Wenn das Stackpanel untergeordnete Elemente hat, ist meine Schaltfläche aktiviert, keine untergeordneten Elemente, meine Schaltfläche ist deaktiviert.Derzeit handhabe ich das nur im Code, aber ich begann mich zu fragen, ob ich das binden könnte.Vielen Dank für alle Gedanken...
Lösung
Da es sich tatsächlich um einen Bool-Wert handelt, können Sie die Logik umkehren und dies ohne Konverter tun:
<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>
Wenn Sie dies verwenden, treten seitdem einige Probleme beim Erhalten von Updates auf Children.Count
ist kein DP, Sie können einen verwenden ItemsControl
Um das zu umgehen (es verhält sich im Grunde wie ein StackPanel
standardmäßig):
<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>
Andere Tipps
Sie könnten einen einfachen ValueConverter schreiben, der diese Logik für Sie tut.Binden Sie den ISenabled der Taste an den Stackpanel und überprüfen Sie in Ihrem Wert Converter, ob er Kinder enthält und dann true / false zurückgibt.
Eine einfachere Lösung (erfordert Nr ItemsPanel
), als die von H.B. für die bindend sein könnten ActualHeight
Eigentum der StackPanel
, da seine Größe 0 ist, wenn keine untergeordneten Elemente vorhanden sind.
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=sp, Path=ActualHeight}" Value="0">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
Möglicherweise müssen Sie verwenden VerticalAlignment="Top"
für die StackPanel
wenn es nicht richtig schrumpft.