Reputation: 800
Here is the scenario. I have a listview which might have thousands of records based on the criteria provided by the end user. After that using a checkbox, user can group records. So, I have group style defined in xaml for the listview and when user checks the checkbox, I add PropertyGroupDescription to ListCollectionView.
The problem is data virtualization is disabled because of the groupstyle defined for listview which makes the entire record loading process very slow. Is it possible to not to define groupstyle in advance but define the groupstyle when the checkbox is checked by the user?
Thanks,
Upvotes: 1
Views: 939
Reputation: 800
This is the approach I have taken right now to get the benefit of data virtualization while user is not "Grouping the records." I am inserting the Group Style in code behind if required. Posting the code so it might be useful for someone else.
Clearing the values of GroupDescription does not enable the data virtualization. But clearing the GroupStyle collection enableds the data virtualization.
Please let me know how to handle it in XAML.
private GroupStyle retrieveGroupStyle()
{
#region Control template Code(to show content)
ControlTemplate template = new ControlTemplate(typeof(GroupItem));
//Create border object
FrameworkElementFactory border = new FrameworkElementFactory(typeof(Border));
border.SetValue(Border.CornerRadiusProperty, new CornerRadius(3));
border.SetValue(Border.BorderThicknessProperty, new Thickness(2));
border.SetValue(Border.BorderBrushProperty, new SolidColorBrush(Colors.Silver));
border.SetValue(Border.PaddingProperty, new Thickness(2));
//create dockpanel to put inside border.
FrameworkElementFactory dockPanel = new FrameworkElementFactory(typeof(DockPanel));
dockPanel.SetValue(DockPanel.LastChildFillProperty, true);
//stack panel to show group header
FrameworkElementFactory stackPanel = new FrameworkElementFactory(typeof(StackPanel));
stackPanel.SetValue(StackPanel.OrientationProperty, Orientation.Vertical);
stackPanel.SetValue(DockPanel.DockProperty, Dock.Top);
//Create textBlock to show group header
FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock));
textBlock.SetValue(TextBlock.PaddingProperty, new Thickness(2));
textBlock.SetValue(TextBlock.FontWeightProperty, FontWeights.Bold);
textBlock.SetValue(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("Name") });
stackPanel.AppendChild(textBlock);
template.VisualTree = border;
//define items presenter
FrameworkElementFactory itemsPresenter = new FrameworkElementFactory(typeof(ItemsPresenter));
itemsPresenter.SetValue(ItemsPresenter.MarginProperty, new Thickness(2));
border.AppendChild(dockPanel);
dockPanel.AppendChild(stackPanel);
dockPanel.AppendChild(itemsPresenter);
template.VisualTree = border;
#endregion
#region Set container style for Group
Style style = new Style(typeof(GroupItem));
Setter setter = new Setter();
setter.Property = GroupItem.TemplateProperty;
setter.Value = template;
style.Setters.Add(setter);
GroupStyle groupStyle = new GroupStyle();
groupStyle.ContainerStyle = style;
#endregion
return groupStyle;
}
/// <summary>
/// Adds the group style (once the group styles are defined virtualization is disabled.)
/// </summary>
private void addGroupStyle()
{
this.listView1.GroupStyle.Add(this.retrieveGroupStyle());
this.listView2.GroupStyle.Add(this.retrieveGroupStyle());
}
/// <summary>
/// Removes the group style. (once the group style is removed virtualization is enabled.)
/// </summary>
private void removeGroupStyle()
{
this.listView1.GroupStyle.Clear();
this.listView2.GroupStyle.Clear();
}
private void CheckBox_Checked_1(object sender, RoutedEventArgs e)
{
this.addGroupStyle();
}
private void CheckBox_Unchecked_1(object sender, RoutedEventArgs e)
{
this.removeGroupStyle();
}
Upvotes: 1