Как скрыть элемент управления, если базовый DataContext равен нулю? - PullRequest
23 голосов
/ 16 марта 2011

В моей модели представления есть объект, обладающий множеством свойств, некоторые из которых иногда будут нулевыми.Я не хочу просто показывать некоторые элементы управления, если эти конкретные элементы управления являются нулевыми.Как бы я скрыл управление, если привязка нулевая?Я думал о каком-то конвертере, но не знаю, как мне это сделать.Любые идеи?

edit: извините, я должен упомянуть, что это также будет в Silverlight, поэтому я не уверен, сработают ли триггеры стиля ...?

Ответы [ 6 ]

36 голосов
/ 14 марта 2012

Этот подход проще:

<CheckBox Visibility="{Binding Path=checkedField, TargetNullValue=Collapsed }">

Когда связанное свойство checkedField равно нулю, видимость будет установлена ​​на Свернутый.

26 голосов
/ 16 марта 2011

Есть конвертер, как следует,

public sealed class NullToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? Visibility.Hidden: Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Теперь свяжите свойство с свойством Visibility. Как,

<ListBox ItemsSource="{Binding Path=Squad}" 
         Visibility="{Binding Converter={StaticResource nullToVisibilityConverter}, 
                              Path=Squad}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
5 голосов
/ 19 марта 2015

Мне также нужно было это для приложения WindowsPhone WinRT.В итоге я использовал @ конвертер PrinceAshitaka с незначительной модификацией в привязке, как предложено в этом ответе на похожий вопрос

Вы должны использовать FallbackValue=Collapsed, чтобы не показыватьконтроль именно тогда, когда текст данных является нулевым.Не уверен, почему TargetNullValue=Collapsed не работает для меня.

Visibility="{Binding Converter={StaticResource NullToVisibilityConverter}, FallbackValue=Collapsed}"
3 голосов
/ 16 марта 2011

В Silverlight вы можете использовать следующий подход - добавить триггер для управления:

<i:Interaction.Triggers>
    <core:DataTrigger Binding="{Binding SomeProperty}" Comparison="Equal" Value="{x:Null}">
        <core:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
    </core:DataTrigger>
</i:Interaction.Triggers>
2 голосов
/ 16 марта 2011

Вы можете использовать событие DataContextChanged, когда DataContext равен нулю, вы можете установить Visibility на Collapsed

Подробнее об этом здесь

0 голосов
/ 12 октября 2016

Это нужно, но я не мог заставить его работать в DataTemplate внутри DataGridTemplateColumn, поэтому вот мой пример того, как я заставил его работать.

 <DataGridTemplateColumn>
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
            <ComboBox ItemsSource="{Binding Path=DataContext.AvailableHierarchies, 
                                            RelativeSource={RelativeSource FindAncestor, 
                                            AncestorType={x:Type ItemsControl}} }"
                      DisplayMemberPath="Name"
                      SelectedItem="{Binding Path=DataContext.SelectedHierarchy, 
                                             RelativeSource={RelativeSource FindAncestor, 
                                             AncestorType={x:Type ItemsControl}},UpdateSourceTrigger=PropertyChanged }"
                                      >
            <ComboBox.Style>
                <Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
                    <Style.Triggers>
                        <Trigger Property="ComboBox.ItemsSource" Value="{x:Null}">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ComboBox.Style>
        </ComboBox>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
...