Кнопка привязки IsEnabled к StackPanel имеет дочерние элементы - PullRequest
3 голосов
/ 17 мая 2011

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

Ответы [ 3 ]

6 голосов
/ 17 мая 2011

На самом деле, поскольку вы имеете дело с bool, вы можете инвертировать логику и делать это без конвертеров:

<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 голосов
/ 17 мая 2011

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

0 голосов
/ 31 мая 2012

Более простое решение (не требует ItemsPanel), чем HB, может быть привязано к свойству ActualHeight StackPanel, поскольку его размер будет равен 0, если нет дочерних элементов.* Возможно, вам придется использовать VerticalAlignment="Top" для StackPanel, если он не сжимается должным образом.

...