在视图模型内部,我定义了一个ObservableCollection并将其与数据网格绑定;
AllData = CollectionViewSource.GetDefaultView(_allData);
但是现在我需要将视图中的数据分组,而不是通过列标题。我需要按数据网格中的内容分组:
例如,我有A,B,C,D,E,F列,如果ColumnA.Content包含keyword1,则为Group1,否则,如果ColumnB和ColumnC不为空,则为group2,否则,如果ColumnD包含keyword2 ,它是第3组...
我该如何分组?
谢谢!
Eva
答案 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;
}