How can i bind a border visibility to the visibility of containing children objects

笑着哭i 提交于 2019-12-24 10:38:16

问题


I have this kind of code below, how can I bind the visibility of the Border to the visibility of all the labels?

Of course the number of rows and labels is not fixed.

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


It depends on how you are changing the amount of rows and labels.

I assume that MyObject is a List<MyObject>. In that case what you can do is simply bind the list to the Visibility property with a Converter that loops through the objects checking if they are all invisible.

XAML:

Namespace:

xmlns:converters="clr-namespace:MyConverters"    

Window:

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


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

Converters Code:

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

Otherwise you are going to have to explain how you got the amount of rows and labels to be dynamic and we can work from there.

Hope this helps

u_u


EDIT

Well according to your comment you have a list of strings which contain the name of the object you want to display in each ListViewItem. I'm not going to ask why you are doing it this way, I assume you have a reason. I just wanna say have you tried Key Value pairs?

What I would do here is pass the grid itself as a parameter in the converter, and loop through its children using a LogicalTreeHelper inside the converter.

Revised Border:

<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">
       [...]

Revised Converter

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

I coded this all by hand so there's prolly a bunch of errors, but I hope you get the point.

u_u



来源:https://stackoverflow.com/questions/9921969/how-can-i-bind-a-border-visibility-to-the-visibility-of-containing-children-obje

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!