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

问题描述 投票:0回答:7

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

编辑:抱歉,我应该提到这也将在 Silverlight 中,所以我不确定样式触发器是否有效...?

c# wpf silverlight binding datacontext
7个回答
40
投票

这种方法更简单:

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

当绑定属性

checkedField
为空时,Visibility将被设置为Collapsed。


29
投票

有一个如下转换器,

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
投票

我还需要这个用于 WindowsPhone WinRT 应用程序。我最终使用了 @PrinceAshitaka 的转换器,并对绑定进行了细微修改,如 此类似问题的答案

中所建议的那样

您应该使用

FallbackValue=Collapsed
来避免在数据上下文为空时精确显示控件。不知道为什么
TargetNullValue=Collapsed
对我不起作用。

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

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>

2
投票

您可以使用

DataContextChanged
事件,当 DataContext 为空时,您可以将 Visbility 设置为
Collapsed

阅读更多相关信息这里


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>

0
投票

结合 bugfixr 的答案Phil 的答案,我想出了(在 WPF 中):

<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}"
    />
© www.soinside.com 2019 - 2024. All rights reserved.