【问题标题】:How can i bind a border visibility to the visibility of containing children objects如何将边框可见性绑定到包含子对象的可见性
【发布时间】:2012-03-29 08:47:09
【问题描述】:

我下面有这种代码,如何将Border的可见性绑定到所有标签的可见性?

当然行数和标签数不是固定的。

<Border BorderBrush=Black
        BorderThickness="1,1,1,1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
         </Grid.RowDefinitions>

         <Label DataContext="{Binding MyObject[1]}"
                Content="{Binding MyText}"
                Visibility="{Binding IsVisible}"/>

         <Label DataContext="{Binding MyObject[2]}"
                Content="{Binding MyText}"
                Visibility="{Binding IsVisible}"/>
[...]
    </Grid>
</Border>

【问题讨论】:

  • 澄清一下,您的意思是如果其中一个标签可见,您希望边框可见吗?
  • 是的,或者如果所有标签都不可见,那么我希望我的边框折叠起来,避免显示空边框。

标签: wpf xaml ivalueconverter


【解决方案1】:

这取决于您如何更改行数和标签。

我假设MyObjectList&lt;MyObject&gt;。在这种情况下,您可以简单地将列表绑定到 Visibility 属性,并使用 Converter 循环检查对象是否全部不可见。

XAML:

命名空间:

xmlns:converters="clr-namespace:MyConverters"    

窗口:

<Window.Resources>
    <converters:ObjectBorderVisibilityConverter 
               x:Key="MyObjectBorderVisibilityConverter"/>
</Window.Resources>


<Border BorderBrush=Black
    BorderThickness="{Binding MyObject, Converter={StaticResource MyObjectBorderVisibilityConverter}">
[...]

转换器代码:

namespace MyConverters
{
    public class ObjectBorderVisibilityConverter: IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Visibility v = Visibility.Hidden;

            List<MyObject> myObjects = value as List<MyObject>;
            foreach(Object myobject in myObjects)
            {
                   if (myobject.IsVisible)
                       v = Visibility.Visible;
            }      
            return v;
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new InvalidOperationException("ObjectBorderVisibilityConvertercan only be used OneWay.");        
        }
    }
}

否则,您将不得不解释如何使行数和标签数量成为动态的,我们可以从那里开始工作。

希望对你有帮助

u_u


编辑

根据您的评论,您有一个字符串列表,其中包含您要在每个ListViewItem 中显示的对象的名称。我不会问你为什么这样做,我假设你有一个理由。我只想说你试过键值对吗?

我在这里要做的是将网格本身作为参数传递给转换器,并在转换器中使用LogicalTreeHelper 循环遍历其子节点。

修改边框:

<Window.Resources>
<converters:ObjectBorderVisibilityConverter 
           x:Key="MyObjectBorderVisibilityConverter"/>
</Window.Resources>


<Border BorderBrush=Black
        BorderThickness="{Binding MyObject, Converter={StaticResource MyObjectBorderVisibilityConverter}", ConverterParameter={Binding ElementName=myGrid, BindsDirectlyToSource=True>
       <Grid x:Name="myGrid">
       [...]

修改后的转换器

namespace MyConverters
{
    public class ObjectBorderVisibilityConverter: IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Visibility v = Visibility.Hidden;
            Grid myGrid = parameter as Grid;
            List<MyObject> myObjects = value as List<MyObject>;
            foreach (var child in LogicalTreeHelper.GetChildren(myGrid))
            {
                   if(child.GetType() == typeof(System.Windows.Controls.Label)
                      if (((Label)child).Visibility = Visibility.Visible)
                           v = Visibility.Visible;
            }     
            return v;
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new InvalidOperationException("ObjectBorderVisibilityConvertercan only be used OneWay.");        
        }
    }
}

我都是手工编写的,所以有很多错误,但我希望你明白这一点。

u_u

【讨论】:

  • 实际上,行是由字符串列表中的代码生成的,并根据字符串生成绑定。它与由字符串命名的对象的“.IsVisible”属性进行了一次绑定。所以我可能知道可能的可见项目编号,但不知道实数,因为我在我的班级中没有构造真实对象的行,但只有名称来创建绑定。
  • @user1300261 我更新了我的答案,希望对您有所帮助。随时通知我
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2012-05-15
  • 2013-12-13
  • 2019-07-21
  • 2014-06-17
相关资源
最近更新 更多