如果底层DataContext为null,如何隐藏控件?

时间:2011-03-16 10:16:55

标签: c# wpf silverlight binding datacontext

我的视图模型中有一个对象,它有一堆属性,其中一些偶尔会为null。如果这些特定控件为null,我不想只显示一些控件。如果绑定为null,我将如何隐藏控件?我在想某种转换器,但不知道我是怎么做的。有什么想法吗?

编辑:对不起,我应该提一下,这也将在Silverlight中,所以我不确定Style触发器是否会起作用......?

6 个答案:

答案 0 :(得分:36)

这种方法更容易:

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

当绑定属性checkedField为空时,可见性将设置为折叠。

答案 1 :(得分:25)

有一个如下的转换器,

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>

答案 2 :(得分:5)

我还需要这个用于WindowsPhone WinRT应用程序。我最终使用@PrinceAshitaka's converterthis answer to a similar question

中建议的绑定进行了少量修改

当datacontext为null时,您应该使用FallbackValue=Collapsed来避免精确显示控件。不确定为什么TargetNullValue=Collapsed对我不起作用。

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

您可以使用DataContextChanged事件,当DataContext为null时,您可以将可见性设置为Collapsed

详细了解here

答案 5 :(得分:0)

需要这个,但是我无法让它在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>