仅在选中且不为空时才显示元素

Posted

技术标签:

【中文标题】仅在选中且不为空时才显示元素【英文标题】:Show element only when selected and only when is not empty 【发布时间】:2021-09-27 23:15:51 【问题描述】:

我的情况与此问题类似: Displaying Content only when ListViewItem is Selected

我有一个 ComboBox,我只想在包含它的 ListViewItem 被选中并且 ComboBox 不为空时显示(这两个条件都必须为真)。将可见性绑定到只读属性非常容易,该属性检查 ViewModel 中的 ItemsSource 属性是否有任何项目,并且通过上面的链接还解决了如何仅在选择 ListViewItem 时才显示它,但我无法加入这两个条件。如何仅在选中项目且组合不为空时才显示 ComboBox?

ComboBox 中的这种样式的作用是仅在被选中时才显示:

<ComboBox ItemsSource="Binding DataContext.ListaPedidosPendientes, RelativeSource=RelativeSource FindAncestor, AncestorType=UserControl" DisplayMemberPath="numero">
    <ComboBox.Style>
        <Style TargetType="x:Type ComboBox">
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="Binding RelativeSource=RelativeSource Mode=FindAncestor,
                    AncestorType=x:Type ListBoxItem,Path=IsSelected" Value="True">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
</ComboBox>

如何添加第二个条件 (ListaPedidosPendientes.Count > 0)?

谢谢

【问题讨论】:

【参考方案1】:

要设置两个触发器。 而条件正好相反。 由于触发器仅检查相等性,因此您可以将 Items.Count 与零进行比较。 但是条件 >0 不能检查。

<ComboBox ItemsSource="Binding DataContext.ListaPedidosPendientes, RelativeSource=RelativeSource FindAncestor, AncestorType=UserControl" DisplayMemberPath="numero">
    <ComboBox.Style>
        <Style TargetType="x:Type ComboBox">
            <Setter Property="Visibility" Value="Visible"/>
            <Style.Triggers>
                <DataTrigger Binding="Binding RelativeSource=RelativeSource Mode=FindAncestor,
                    AncestorType=x:Type ListBoxItem,Path=IsSelected" Value="False">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
                <DataTrigger Binding="Binding RelativeSource=RelativeSource Self, Path=Items.Count" Value="0">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
</ComboBox>

【讨论】:

【参考方案2】:

您可以评估组合框https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.itemscontrol.hasitems?view=net-5.0 的HasItems 属性 并反转条件:默认可见,未选中或没有项目时折叠。未经测试的航空代码:

<ComboBox ItemsSource="Binding DataContext.ListaPedidosPendientes, RelativeSource=RelativeSource FindAncestor, AncestorType=UserControl" DisplayMemberPath="numero">
    <ComboBox.Style>
        <Style TargetType="x:Type ComboBox">
            <Setter Property="Visibility" Value="Visible"/>
            <Style.Triggers>
                <DataTrigger Binding="Binding RelativeSource=RelativeSource Mode=FindAncestor,
                    AncestorType=x:Type ListBoxItem,Path=IsSelected" Value="False">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
                <Trigger Property="HasItems" Value="False">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
</ComboBox>

【讨论】:

以上是关于仅在选中且不为空时才显示元素的主要内容,如果未能解决你的问题,请参考以下文章

Laravel/Eloquent/DB 查询 - 当为空且不为空时加入

SQL Server 查询仅在没有变量为空时才有效

FluentValidation - 仅当值不为空时检查值是表达式

SwiftUI:仅当输入不为空时才启用保存按钮

Spring - 仅当值不为空时才设置属性

仅当查询不为空时,才从查询写入 BigQuery 中的表