我在视图模型中有一个对象,它有很多属性,其中一些偶尔会为空。我不想只在这些特定控件为空时显示某些控件。如果绑定为空,我应该如何隐藏控件?我考虑过使用某种转换器,但不知道如何确切地操作。有什么想法吗?
编辑:对不起,我应该提到这也将用于Silverlight,所以我不确定样式触发器是否有效...?
我在视图模型中有一个对象,它有很多属性,其中一些偶尔会为空。我不想只在这些特定控件为空时显示某些控件。如果绑定为空,我应该如何隐藏控件?我考虑过使用某种转换器,但不知道如何确切地操作。有什么想法吗?
编辑:对不起,我应该提到这也将用于Silverlight,所以我不确定样式触发器是否有效...?
这种方法更简单:
<CheckBox Visibility="{Binding Path=checkedField, TargetNullValue=Collapsed }">
当绑定属性checkedField
为null时,Visibility将被设置为Collapsed。有一个像下面这样的转换器:
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>
FallbackValue=Collapsed
以避免在数据上下文为空时精确显示控件。不确定为什么对我而言TargetNullValue=Collapsed
没有起作用。Visibility="{Binding Converter={StaticResource NullToVisibilityConverter}, FallbackValue=Collapsed}"
<i:Interaction.Triggers>
<core:DataTrigger Binding="{Binding SomeProperty}" Comparison="Equal" Value="{x:Null}">
<core:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
</core:DataTrigger>
</i:Interaction.Triggers>
我需要这个,但是我无法在DataGridTemplateColumn内的DataTemplate中使其工作,所以这里是我成功实现的示例。
<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>
<Button
Name="Button1"
Click="Button1_Click"
Content="{Binding Path=ActiveSubJob.ButtonText[0]}"
Visibility="{Binding Path=ActiveSubJob.ButtonText[0],
Converter={StaticResource AlwaysVisibleConverter},
FallbackValue=Collapsed,
TargetNullValue=Collapsed}"
IsEnabled="{Binding Path=IsButton1Enabled}"
/>
public object? Convert(object? value, Type targetType, object parameter, CultureInfo culture)
{
if (value is null)
{
return null;
}
return Visibility.Visible;
}
checkedField
未被选中,但是obj
(使用obj.checkedField
)为空,则使用点语法来设置Path
属性<CheckBox Visibility="{Binding Path=., TargetNullValue=Collapsed }">
。 - Mikhail PodacheckedField
不是Visibility
,则会抛出异常。 - Trisped