我正在使用热门代码对listview项目进行排序和分组。排序和分组工作完美。问题是当用户点击列标题进行排序然后所有组变为ie扩展或折叠(取决于Expander IsExpanded =“False”)我需要的是排序列,使扩展器处于当前状态:一些扩展,一些崩溃。我还检查了一些示例项目,但所有项目都有相同的行为。任何想法,是否可行?提前谢谢!
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Margin" Value="0,0,0,5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="False" BorderBrush="#FFA4B97F"
BorderThickness="0,0,0,1" >
<Expander.Header>
<DockPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Name}"
Margin="5,0" Width="Auto"/>
<TextBlock FontWeight="Bold"
Text="{Binding Path=ItemCount}"/>
<TextBlock FontWeight="Bold" Text=" Items"/>
</DockPanel>
</Expander.Header>
<Expander.Content>
<ItemsPresenter />
</Expander.Content>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
ICollectionView view = CollectionViewSource.GetDefaultView(dataSet.Tables[0]);
view.GroupDescriptions.Add(new PropertyGroupDescription("NameOfColumnForGrouping"));
listViewOpportunitiesHistory.ItemsSource = view;
排序:
listViewOpportunitiesHistory.Items.SortDescriptions.Add(new SortDescription(field, newDir));
以下是我解决问题的方法:
<ListView x:Name="listViewOpportunitiesHistory" ItemsSource="{Binding}" AlternationCount="2"
IsTextSearchEnabled="False" IsSynchronizedWithCurrentItem="True" >
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Margin" Value="0,0,0,5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Grid x:Name="grid_ControlTemplate_listViewOpportunitiesHistory" Loaded="grid_ControlTemplate_listViewOpportunitiesHistory_Loaded">
<Expander BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1"
x:Name="expanderControlTemplate" Expanded="expanderExpandCollapse_Expanded" Collapsed="expanderExpandCollapse_Collapsed" >
<Expander.Header>
<DockPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Name}"
Margin="5,0" Width="Auto"/>
<TextBlock FontWeight="Bold"
Text="{Binding Path=ItemCount}"/>
<TextBlock FontWeight="Bold" Text=" Items"/>
</DockPanel>
</Expander.Header>
<Expander.Content>
<ItemsPresenter />
</Expander.Content>
</Expander>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Width="Auto" x:Name="listViewOpportunitiesHistoryColumn_Time" >
<GridViewColumnHeader Click="SortClickHistory" Tag="Time" Content=" Time " x:Name="listViewOpportunitiesHistoryColumnHeader_Time" />
<GridViewColumn.CellTemplate >
<DataTemplate>
<Border BorderBrush ="Gray" BorderThickness="0,0,1,0" Margin="-6,0,-6,0">
<Grid Margin="6,0,6,0" >
<TextBlock Text="{Binding Path=Time, StringFormat='yyyy-MM-dd HH:mm:ss.fff'}" Grid.Column ="0" TextTrimming="CharacterEllipsis" VerticalAlignment="Center" HorizontalAlignment="Left" ToolTipService.ToolTip="{Binding Path=Time}" />
</Grid>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="Auto" x:Name="listViewOpportunitiesHistoryColumn_AOValue" >
<GridViewColumnHeader Click="SortClickHistory" Tag="AOValue" Content=" AO Value " x:Name="listViewOpportunitiesHistoryColumnHeader_AOValue" />
<GridViewColumn.CellTemplate >
<DataTemplate>
<Border BorderBrush ="Gray" BorderThickness="0,0,1,0" Margin="-6,0,-6,0">
<Grid Margin="6,0,6,0" >
<TextBlock Text="{Binding Path=AOValue}" Grid.Column ="0" TextTrimming="CharacterEllipsis" VerticalAlignment="Center" HorizontalAlignment="Left" ToolTipService.ToolTip="{Binding Path=AOValue}" />
</Grid>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
代码背后:
private Dictionary<string, bool?> expandStates = new Dictionary<string, bool?>();
private void grid_ControlTemplate_listViewOpportunitiesHistory_Loaded(object sender, RoutedEventArgs e)
{
var grid = (Grid)sender;
var dc = grid.DataContext as CollectionViewGroup;
var groupName = (string)dc.Name.ToString();
//If the dictionary contains the current group, retrieve a saved state of the group
if (this.expandStates.ContainsKey(groupName))
{
var expander = (Expander)grid.FindName("expanderControlTemplate");
//btn.IsExpanded = this.expandStates[groupName];
if (this.expandStates[groupName] == true)
{
expander.IsExpanded = true;
}
if (this.expandStates[groupName] == false)
{
expander.IsExpanded = false;
}
}
}
private void expanderExpandCollapse_Collapsed(object sender, RoutedEventArgs e)
{
var expander = (Expander)sender;
var dc = (CollectionViewGroup)expander.DataContext;
var groupName = (string)dc.Name.ToString();
//Loaded event is fired earlier than the Click event, so I'm sure that the dictionary contains the key
this.expandStates[groupName] = expander.IsExpanded; //Save the current state
}
private void expanderExpandCollapse_Expanded(object sender, RoutedEventArgs e)
{
var expander = (Expander)sender;
var dc = (CollectionViewGroup)expander.DataContext;
var groupName = (string)dc.Name.ToString();
//Loaded event is fired earlier than the Click event, so I'm sure that the dictionary contains the key
this.expandStates[groupName] = expander.IsExpanded; //Save the current state
}
我从DataSet获取数据:
ICollectionView view = CollectionViewSource.GetDefaultView(dataSet.Tables[0]);
view.GroupDescriptions.Add(new PropertyGroupDescription(FXH.string_GroupBy_OpportunitiesHistory));
listViewOpportunitiesHistory.ItemsSource = view;
此解决方案基于Sort and Group ListItems in a WPF ListBox- GroupItem collapse and expand
答案 0 :(得分:0)
如果您希望每个组的扩展器保存其 IsExpanded 属性,则必须使用数据绑定,或者必须对视图(扩展器本身)进行排序。我认为第一种方式很容易实现。您需要为集合集合添加 bool 值的镜像集合。在xaml中,您应该使用converter绑定:
<Expander IsExpanded="{Binding Converter={StaticResource MyOwnConverter}}"
BorderBrush="#FFA4B97F"
BorderThickness="0,0,0,1" >
<Expander.Header>
<DockPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Name}"
Margin="5,0" Width="Auto"/>
<TextBlock FontWeight="Bold"
Text="{Binding Path=ItemCount}"/>
<TextBlock FontWeight="Bold" Text=" Items"/>
</DockPanel>
</Expander.Header>
<Expander.Content>
<ItemsPresenter />
</Expander.Content>
</Expander>
在转换器中,您可以将引用存储到ViewModel(或仅存储到 ICollectionView ),并为每个组存储当前 IsExpanded 状态,并将其用于知道,返回哪个值。您还应该仔细处理事件 CollectionChanged (如果您的集合将在运行时更改),以添加或删除该组的状态。