Можно ли определить GroupStyle во время выполнения для просмотра списка?
Вот сценарий. У меня есть просмотр списка, который может иметь тысячи записей на основе критериев, предоставленных конечным пользователем. После этого с помощью флажка пользователь может группировать записи. Итак, у меня есть стиль группы, определенный в xaml для просмотра списка, и когда пользователь устанавливает флажок, я добавляю PropertyGroupDescription в ListCollectionView.
Проблема в том, что виртуализация данных отключена из-за стиля группы, определенного для просмотра списка, что делает весь процесс загрузки записей очень медленным. Можно ли не определять стиль группы заранее, а определять стиль группы, когда флажок установлен пользователем?
Спасибо,
1 ответ
Именно такой подход я выбрал прямо сейчас, чтобы воспользоваться преимуществами виртуализации данных, пока пользователь не "группирует записи". Я вставляю стиль группы в код позади, если требуется. Размещение кода, чтобы он мог быть полезен для кого-то еще.
Очистка значений GroupDescription не включает виртуализацию данных. Но очистка коллекции Group Style включает виртуализацию данных.
Пожалуйста, дайте мне знать, как справиться с этим в 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();
}