【问题标题】:Binding property to visibility of other element将属性绑定到其他元素的可见性
【发布时间】:2016-06-28 21:54:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf binding visibility


    【解决方案1】:

    使用数据触发器:

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

    【讨论】:

    • @Gopichandar Thx 提醒一下,SO 没有发布 ctrls:BusyDecorator 的代码,所以我在发布之前使用 TextBlock 仔细检查了我的代码,但忘记更改结束标签。现已修复。
    • 没关系。这是我的 +1 特别是 BaseOn
    • 好的,谢谢我采用这种方法,但我已将“BasedOn = "{DynamicResource..." 更改为 "BasedOn = "{StaticResource..." 因为 BasedOn 与 DynamicResource 不兼容
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 2015-08-23
      • 2016-12-08
      • 2012-05-23
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多