Как я могу связать видимость границы с видимостью содержащих дочерние объекты - PullRequest
1 голос
/ 29 марта 2012

У меня есть такой код ниже, как я могу связать видимость Границы с видимостью всех меток?

Конечно количество строк и меток не фиксировано.

<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 Ответ

2 голосов
/ 29 марта 2012

Это зависит от того, как вы меняете количество строк и меток.

Я предполагаю, что MyObject - это List<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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...