如何在 ListView 中不展开分组?

How to not Expanding Grouping in ListView?

请问,如何使用 DataTrigger 将分组 ListView 中的扩展器设置为 False 并评估 ListView 中的任何列值?

我的代码:

XAML:

<ListView Name="lvwGrupoPunto">
    <ListView.View>
        <GridView>
            <GridView.ColumnHeaderContainerStyle>
                <Style TargetType="GridViewColumnHeader">
                    <Setter Property="Visibility" Value="Collapsed" />
                </Style>
            </GridView.ColumnHeaderContainerStyle>
            <GridViewColumn Header="Prestación" Width="300" DisplayMemberBinding="{Binding NombrePrestacion}"/>
            <GridViewColumn Header="Tipo Valor Punto" Width="30" DisplayMemberBinding="{Binding NombreTipoValorPunto}"/>
            <GridViewColumn Header="Valor Punto" Width="50" DisplayMemberBinding="{Binding ValorCalculoPunto, StringFormat=N2}"/>
        </GridView>
    </ListView.View>
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Expander>
                                    <Expander.Style>
                                        <Style TargetType="Expander">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Path=ValorCalculoPunto}" Value="{x:Null}">
                                                    <Setter Property="IsExpanded" Value="False" />
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </Expander.Style>
                                    <Expander.Header>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding Name}" FontWeight="Bold"/>
                                        </StackPanel>
                                    </Expander.Header>
                                    <ItemsPresenter />
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </ListView.GroupStyle>
</ListView>

我的 C#:

    public class ItemValorPunto
    {
        public string NombrePrestacion { get; set; }
        public string NombreGrupoPunto { get; set; }    
        public decimal? ValorCalculoPunto { get; set; }
        public string TipoValorPunto { get; set; }
    }
    List<ItemValorPunto> itemValorPuntoColeccion = new List<ItemValorPunto>();
    itemValorPuntoColeccion.Add(new ItemValorPunto() { NombrePrestacion = "", NombreGrupoPunto = "PARTO 1", ValorCalculoPunto = null, TipoValorPunto = "" });
    itemValorPuntoColeccion.Add(new ItemValorPunto() { NombrePrestacion = "ANTICUERPOS ANTI SCL 70", NombreGrupoPunto = "PARTO 2", ValorCalculoPunto = 3.4000, TipoValorPunto = "$" });
    itemValorPuntoColeccion.Add(new ItemValorPunto() { NombrePrestacion = "ANTICUERPOS ANTI SM-RNP", NombreGrupoPunto = "PARTO 2", ValorCalculoPunto = 2.5000, TipoValorPunto = "%" });
    itemValorPuntoColeccion.Add(new ItemValorPunto() { NombrePrestacion = "", NombreGrupoPunto = "PARTO 3", ValorCalculoPunto = null, TipoValorPunto = "" });
    itemValorPuntoColeccion.Add(new ItemValorPunto() { NombrePrestacion = "", NombreGrupoPunto = "PARTO 4", ValorCalculoPunto = null, TipoValorPunto = "" });
    itemValorPuntoColeccion.Add(new ItemValorPunto() { NombrePrestacion = "ANTICUERPOS ANTI MITOCONDRIALE", NombreGrupoPunto = "PARTO 5", ValorCalculoPunto = 10.00, TipoValorPunto = "$" });
    itemValorPuntoColeccion.Add(new ItemValorPunto() { NombrePrestacion = "ANTICUERPOS ANTI SM-RNP", NombreGrupoPunto = "PARTO 5", ValorCalculoPunto = 0.10, TipoValorPunto = "%" });
    lvwGrupoPunto.ItemsSource = itemValorPuntoColeccion;
    CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvwGrupoPunto.ItemsSource);
    PropertyGroupDescription groupDescription = new PropertyGroupDescription("NombreGrupoPunto");
    view.GroupDescriptions.Add(groupDescription);

我只需要显示不为空的项目"ValorCalculoPunto"

But I get this

将 XAML 中的 Expander 更改为:

<Expander IsExpanded="{Binding Items[0].ValorCalculoPunto, Converter={StaticResource IsNotNullConverter}, Mode=OneWay}">
    <Expander.Header>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Name}" FontWeight="Bold"/>
        </StackPanel>
    </Expander.Header>
    <ItemsPresenter />
</Expander>

IsNotNullConverter 添加到 WindowsResources collection。

<Window.Resources>
    <local:IsNotNullConverter x:Key="IsNotNullConverter"></local:IsNotNullConverter>
</Window.Resources>

它的实现是:

public class IsNotNullConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value != null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

问题是默认情况下 ExpanderIsExpanded 属性 是 false。所以你不能只用一个 DataTrigger 来告诉 Expander 什么时候应该关闭。它们默认关闭。

此外,当您绑定时,组中的 DataContext 类型为 CollectionViewGroup,因此绑定中的 Items[0] 部分。