如何通过复选框关闭使用CollectionViewSource实现的WPF/MVVM DataGrid分组?

3

我已经实现了数据网格分组功能,以下是我的操作步骤(省略了带有展开器的GroupStyle):

<CollectionViewSource x:Key="SelectedObjectsViewSource" Source="{Binding SelectedObjectItems}">
    <CollectionViewSource.GroupDescriptions>
       <PropertyGroupDescription PropertyName="TableId"/>
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>


<DataGrid Name="SelectedObjectsGrid" 
     ItemsSource="{Binding Source={StaticResource SelectedObjectsViewSource}}"
     SelectionMode="Extended"
     CanUserAddRows="False"
     AutoGenerateColumns="False">

我想添加一个复选框,让用户可以开启/关闭分组。但我不知道如何在MVVM中实现这个功能。

2个回答

2

我建议您将复选框绑定到视图模型的布尔属性上,其中setter还设置了分组状态以跟随分配的值更改集合视图。就像以下示例中一样:将绑定到复选框状态的布尔属性是GroupView,绑定到数据网格的集合是View。

C# ViewModel

class ViewModel : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private ICollectionView _View;
    public ICollectionView View
    {
        get
        {
            return _View;
        }
        set
        {
            _View = View;
            NotifyPropertyChanged("View");
        }
    }

    private bool _GroupView;
    public bool GroupView
    {
        get
        {
            return _GroupView;
        }
        set
        {
            if (value != _GroupView)
            {
                // Clear Grouping status of the view
                View.GroupDescriptions.Clear();
                if (value)
                {
                    // If true set Grouping status
                    View.GroupDescriptions.Add(new PropertyGroupDescription("TableId"));
                }
                _GroupView = value;
                NotifyPropertyChanged("GroupView");

                // Notify the UI that also the View changed in order to redraw the datagrid with or without grouping
                NotifyPropertyChanged("View");
            }
        }
    }   
}

C# 代码后台

public partial class MyWindow : Window
{
    public MyWindow()
    {
        InitializeComponent();
        ViewModel myViewModel = new ViewModel();
        myViewModel.View = .....;
        DataContext = myViewModel;

    }
}

XAML

<StackPanel>
    <CheckBox IsChecked="{Binding GroupView, Mode=TwoWay}"/>
    <DataGrid Name="SelectedObjectsGrid" 
            ItemsSource="{Binding View, Mode=TwoWay}"
            SelectionMode="Extended"
            CanUserAddRows="False"
            AutoGenerateColumns="False"/>
</StackPanel>

谢谢!从XAML中移动GroupView感觉不好,但我想这是唯一的办法。 - char m

0
您可以在当前视图中创建另一个数据网格:
<DataGrid Name="SelectedObjectsGridWithoutGrouping" Visibility="False" 
 ItemsSource="{Binding NewCollection}"
 SelectionMode="Extended"
 CanUserAddRows="False"
 AutoGenerateColumns="False">

接下来,您必须在ViewModel中创建NewCollection(其中包含SelectedObjectItems集合中的项目,但不进行分组),当用户更改复选框时,通过更改Visibility SelectedObjectsGrid或SelectedObjectsGridWithoutGrouping来显示或隐藏其中之一。


谢谢!这可能有效,但我希望有另一种解决方案。 - char m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接