mchicago
mchicago

Reputation: 800

Can the GroupStyle be defined at runtime for listview?

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

Answers (1)

mchicago
mchicago

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

Related Questions