wpf 如果基础DataContext为null,如何隐藏控件?

huwehgph  于 2023-10-22  发布在  其他
关注(0)|答案(7)|浏览(145)

我在视图模型中有一个对象,它有一堆属性,其中一些偶尔会为空。我不想只显示一些控件,如果这些控件是空的。如果绑定为空,我将如何隐藏控件?我在想某种转换器,但不知道我会怎么做。有什么想法吗?
编辑:对不起,我应该提到,这也将在Silverlight中,所以我不知道如果风格触发器将工作.?

drnojrws

drnojrws1#

这种方法更容易:

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

当绑定属性checkedField为null时,可见性将被设置为Collapsed。

kyxcudwk

kyxcudwk2#

有一个转换器如下,

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

ckx4rj1h3#

我也需要一个WindowsPhone WinRT应用程序。最后,我使用了@ eAshitaka的转换器,并按照this answer to a similar question中的建议对绑定进行了微小的修改
您应该使用FallbackValue=Collapsed来避免在上下文为null时精确显示控件。不知道为什么TargetNullValue=Collapsed不适合我。

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

rpppsulh4#

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

yws3nbqq5#

您可以使用DataContextChanged事件,当DataContext为null时,您可以将Visbility设置为Collapsed
阅读更多关于它here

fnatzsnv

fnatzsnv6#

需要这个,但是我不能让它在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>
kwvwclae

kwvwclae7#

结合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}"
    />

不得不调整Phil的AlwaysVisibleConverterConvert方法,以使TargetNullValue正确工作:

public object? Convert(object? value, Type targetType, object parameter, CultureInfo culture)
{
    if (value is null)
    {
        return null;
    }
    return Visibility.Visible;
}

相关问题