Подтвердить что ты не робот

Как скрыть элемент управления, если базовый DataContext имеет значение null?

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

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

4b9b3361

Ответ 1

У вас есть конвертер, например,

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();
    }
}

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

<ListBox ItemsSource="{Binding Path=Squad}" 
         Visibility="{Binding Converter={StaticResource nullToVisibilityConverter}, 
                              Path=Squad}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Ответ 2

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

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

Если связанное свойство checkedField равно null, для параметра Видимость будет установлено значение Сложность.

Ответ 3

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

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

Visibility="{Binding Converter={StaticResource NullToVisibilityConverter}, FallbackValue=Collapsed}"

Ответ 4

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

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

Ответ 5

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

Ответ 6

Это нужно, но я не мог заставить его работать в 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>