C#WPF组datagrid通过数据中的关键字

时间:2019-02-27 14:47:03

标签: c# wpf

在视图模型内部,我定义了一个ObservableCollection并将其与数据网格绑定;

AllData = CollectionViewSource.GetDefaultView(_allData);

但是现在我需要将视图中的数据分组,而不是通过列标题。我需要按数据网格中的内容分组:

例如,我有A,B,C,D,E,F列,如果ColumnA.Content包含keyword1,则为Group1,否则,如果ColumnB和ColumnC不为空,则为group2,否则,如果ColumnD包含keyword2 ,它是第3组...

我该如何分组?

谢谢!

Eva

1 个答案:

答案 0 :(得分:1)

分组依赖于collectionview中的列。解决此问题的最简单方法(如果是新手,则特别简单)是向_allData中的类添加另一个公共属性。

让我们暂时假设这是RowVM(行视图模型的缩写)。

因此_allData是一个ObservableCollection。

我们想对某些东西进行分组,因此向RowVM添加另一个公共属性。看来这将是一个int,因此您需要以下内容:

public class RowVM : BaseViewModel
    {
    public int GroupColumn { get; set; } = 0;
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }

    }

对于您绑定的任何东西,最好实现inotifypropertychanged(如果这是一个新主意,则似乎是msdn文档)。 https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification就是这种情况,即使您的代码没有在任何地方更改属性。

您将需要对每个视图模型执行此操作,因此您希望基类执行此操作,并且您不会重复代码。

因此我继承自BaseViewModel。

这里是一个例子:

public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

只有自动获取器和设置器。也许这应该是一个带有私人支持者的财产,并且当设置者的值发生变化时,raise属性也会发生变化。

您需要以某种方式填充它,因此,显然,您需要某种循环。

您可以使用linq和.ForEach()在foreach或for循环或foreach循环中执行一些代码来做到这一点。

无论您选择哪种。

您需要在其中添加一些代码来实现您的逻辑并设置值

类似的东西:

        foreach (var row in _allData)
        {
            if (row.A.Contains(keyword1))
            {
                row.GroupColumn = 1;
                continue;
            }
            if(string.IsNullOrEmpty(row.B) || string.IsNullOrEmpty(row.B))
            {
                row.GroupColumn = 3;
                continue;
            }
            row.GroupColumn = 2;
        }