如何将边框可见性绑定到包含子对象的可见性

时间:2012-03-29 08:47:10

标签: wpf xaml ivalueconverter

我在下面有这种代码,如何将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>

1 个答案:

答案 0 :(得分:2)

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

我认为MyObjectList<MyObject>。在这种情况下,您可以做的只是将列表绑定到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中显示的对象的名称。我不会问为什么你这样做,我认为你有理由。我只是想说你尝试过Key Value对吗?

我在这里要做的是将网格本身作为转换器中的参数传递,并使用转换器内的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