Кнопка привязки IsEnabled к StackPanel имеет дочерние элементы

Мне интересно, могу ли я связать свою кнопку isEnabled с моими детьми StackPanel (имеет детей). Если у стековой панели есть дочерние элементы, моя кнопка включена, а дочерние элементы моей кнопки отключены. В настоящее время я просто обрабатываю это в коде, но мне стало интересно, можно ли это связать. Спасибо за любые мысли...


person Terco    schedule 16.05.2011    source источник


Ответы (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>
person H.B.    schedule 16.05.2011

Вы можете написать простой ValueConverter, который сделает эту логику за вас. Привяжите IsEnabled кнопки к StackPanel и в конвертере значений проверьте, есть ли у него дочерние элементы, а затем верните true/false.

person Daniel Rose    schedule 16.05.2011
comment
Это, вероятно, самый простой способ сделать это, хотя мне интересно, будет ли он обновляться, когда вы добавляете дочерние элементы в панель стека? - person Tim; 17.05.2011
comment
Во-первых, я бы напрямую привязать к детям. Однако Children не является свойством зависимости, поэтому оно не будет обновляться, поскольку нет уведомления об изменении чего-либо :( Так что вам придется запускать обновление вручную. - person Daniel Rose; 17.05.2011

Более простое решение (не требует 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, если он не сжимается должным образом.

person floele    schedule 31.05.2012