将 属性 绑定到其他元素的可见性

Binding property to visibility of other element

我想当 "StckPnl1" 的可见性设置为 Collapsed 时,我的 "BusyDeco1" 的 属性 "IsBusyIndicatorShowing" 设置为 true。

最简单的解决方案是什么?

    <ctrls:BusyDecorator x:Name="BusyDeco1" IsBusyIndicatorShowing="??" Style="{DynamicResource BusyDecorator1}"/>
    <StackPanel x:Name="StckPnl1" Visibility="Collapsed">

使用数据触发器:

<ctrls:BusyDecorator>
    <ctrls:BusyDecorator.Style>
        <Style TargetType="{x:Type ctrls:BusyDecorator}" BasedOn="{DynamicResource BusyDecorator1}">
            <Setter Property="IsBusyIndicatorShowing" Value="False" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=StckPnl1, Path=Visibility}" Value="Collapsed">
                    <Setter Property="IsBusyIndicatorShowing" Value="True" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ctrls:BusyDecorator.Style>
</ctrls:BusyDecorator>

我用转换器来处理这些东西。

<ctrls:BusyDecorator x:Name="BusyDeco1" 
 IsBusyIndicatorShowing="{Binding ElementName=StckPnl1, Path=Visibility, Converter={StaticResource TrueIfNotVisibleConverter}}" Style="{DynamicResource BusyDecorator1}"/>
<StackPanel x:Name="StckPnl1" Visibility="Collapsed">


<Converter:BoolToVisibilityConverter x:Key="TrueIfVisibleConverter" Inverted="False" Not="False" />
<Converter:BoolToVisibilityConverter x:Key="TrueIfNotVisibleConverter" Inverted="False" Not="True" />
<Converter:BoolToVisibilityConverter x:Key="VisibleIfTrueConverter" Inverted="True" Not="False" />
<Converter:BoolToVisibilityConverter x:Key="VisibleIfNotTrueConverter" Inverted="True" Not="True" />


public class BoolToVisibilityConverter : IValueConverter
{

    private bool inverted = false;
    private bool not = false;

    public bool Inverted
    {
        get { return inverted; }
        set { inverted = value; }
    }

    public bool Not
    {
        get { return not; }
        set { not = value; }
    }


    private object VisibilityToBool(object value)
    {

        if (!(value is Visibility))
            return DependencyProperty.UnsetValue;

        return (((Visibility)value) == Visibility.Visible) ^ Not;

    }

    private object BoolToVisibility(object value, object parameter)
    {

        if (!(value is bool))
            return DependencyProperty.UnsetValue;

        var hiddenodercollapsed = Visibility.Collapsed;
        if (parameter != null && parameter.ToString().ToLower().Contains("hidden"))
            hiddenodercollapsed = Visibility.Hidden;

        return ((bool)value ^ Not) ? Visibility.Visible : hiddenodercollapsed;
    }


    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Inverted ? BoolToVisibility(value, parameter) : VisibilityToBool(value);

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Inverted ? VisibilityToBool(value) : BoolToVisibility(value, parameter);

    }
}