Как скрыть элемент управления, если базовый DataContext имеет значение null?
У меня есть объект в моей модели представления, который имеет кучу свойств, некоторые из которых будут иногда иметь значение null. Я не хочу просто показывать некоторые элементы управления, если эти конкретные элементы управления являются нулевыми. Как я могу скрыть элемент управления, если привязка имеет значение null? Я думал о каком-то конвертере, но не знаю, как бы я это сделал. Любые идеи?
edit: извините, я должен упомянуть, что это также будет в Silverlight, поэтому я не уверен, что триггеры стиля будут работать...?
Ответы
Ответ 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>