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

时间:2016-03-14 00:32:55

标签: wpf binding visibility

我希望当“StckPnl1”的可见性设置为Collapsed时,“BusyDeco1”的属性“IsBusyIndi​​catorShowing”将被设置为true。

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

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

2 个答案:

答案 0 :(得分:1)

使用DataTrigger:

<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>

答案 1 :(得分:0)

我使用转换器来处理这个问题。

<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);

    }
}