如何在 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"
将 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
添加到 Windows
的 Resources
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();
}
}
问题是默认情况下 Expander
的 IsExpanded
属性 是 false
。所以你不能只用一个 DataTrigger
来告诉 Expander
什么时候应该关闭。它们默认关闭。
此外,当您绑定时,组中的 DataContext
类型为 CollectionViewGroup
,因此绑定中的 Items[0]
部分。
请问,如何使用 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"
将 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
添加到 Windows
的 Resources
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();
}
}
问题是默认情况下 Expander
的 IsExpanded
属性 是 false
。所以你不能只用一个 DataTrigger
来告诉 Expander
什么时候应该关闭。它们默认关闭。
此外,当您绑定时,组中的 DataContext
类型为 CollectionViewGroup
,因此绑定中的 Items[0]
部分。