在列表中切换不同的和实际的项目
Toggle distinct and actual items in list
FileRecord 是与我在 MVVM 模型中的 wpf 数据网格绑定的可观察集合。
我的数据网格上方的每一列都有一个复选框。复选框名称是 "SelectUnique--Columnname--"。当我单击这些复选框时,它应该在我的网格中显示列的唯一值。
当我点击 TId 的唯一复选框时,我执行以下逻辑
var grpd = FileRecord.GroupBy(item => item.TID).Select(grp => grp.First());
FileRecord= new ObservableCollection<FileData>(grpd); // will refresh the grid.
然后再次单击 CId 的唯一复选框时,我执行以下逻辑
var grpd = FileRecord.GroupBy(item => item.CID).Select(grp => grp.First());
FileRecord= new ObservableCollection<FileData>(grpd);// will refresh the grid.
等等。在这种情况下,例如,如果我对所有列进行唯一选择,然后再次如果我想随机取消选择复选框(不是按照我选择唯一复选框的顺序),我想撤消我为该特定列所做的操作.例如,如果我取消选中 CID unique 复选框,那么网格应该会得到正确的结果。
如何实现?请帮忙
当我想像这样过滤一个集合时,我有一个 属性 这样的:
public IEnumerable<FileData> FilteredFiles
{
get
{
if (Unique)
{
return Files.GroupBy(item => item.TID).Select(grp => grp.First());
}
else
{
return Files.GroupBy(item => item.CID).Select(grp => grp.First());
}
}
}
public ObservableCollection<FileData> Files
{
get; set;
}
public bool Unique
{
get
{
return unique;
}
set
{
unique = value;
RaisePropertyChanged("FilteredFiles");
}
}
绑定到 FilteredFiles
,当您从集合中 add/remove 时,只需调用 RaisePropertyChanged("FilteredFiles")
通知 UI。
你应该在某处有原始集合的引用,并在那个集合上进行所有计算。
例如,您可以有一个方法,只要选中或取消选中 CheckBox 就会调用该方法,并且该方法 filter/group 是原始集合。
// Simplified properties
private IEnumerable<FileData> FileRecordCollection;
public ObservableCollection<FileData> FileRecord { get; set; }
// Event handlers for the CheckBoxes
private void TID_CheckBox_Checked(object sender, RoutedEventArgs e)
{
UpdateFileRecord();
}
private void TID_CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
UpdateFileRecord();
}
// etc.
// Method that updates FileRecord
private void UpdateFileRecord()
{
IEnumerable<FileData> groupedCollection = FileRecordCollection;
if (TID_CheckBox.IsChecked)
groupedCollection = groupedCollection.GroupBy(item => item.TID).Select(grp => grp.First());
if (CID_CheckBox.IsChecked)
groupedCollection = groupedCollection.GroupBy(item => item.CID).Select(grp => grp.First());
// etc.
FileRecord = new ObservableCollection<FileData>(groupedCollection);
}
这不是最佳选择,但我现在想不出更好的(性能方面)。
FileRecord 是与我在 MVVM 模型中的 wpf 数据网格绑定的可观察集合。
我的数据网格上方的每一列都有一个复选框。复选框名称是 "SelectUnique--Columnname--"。当我单击这些复选框时,它应该在我的网格中显示列的唯一值。
当我点击 TId 的唯一复选框时,我执行以下逻辑
var grpd = FileRecord.GroupBy(item => item.TID).Select(grp => grp.First());
FileRecord= new ObservableCollection<FileData>(grpd); // will refresh the grid.
然后再次单击 CId 的唯一复选框时,我执行以下逻辑
var grpd = FileRecord.GroupBy(item => item.CID).Select(grp => grp.First());
FileRecord= new ObservableCollection<FileData>(grpd);// will refresh the grid.
等等。在这种情况下,例如,如果我对所有列进行唯一选择,然后再次如果我想随机取消选择复选框(不是按照我选择唯一复选框的顺序),我想撤消我为该特定列所做的操作.例如,如果我取消选中 CID unique 复选框,那么网格应该会得到正确的结果。
如何实现?请帮忙
当我想像这样过滤一个集合时,我有一个 属性 这样的:
public IEnumerable<FileData> FilteredFiles
{
get
{
if (Unique)
{
return Files.GroupBy(item => item.TID).Select(grp => grp.First());
}
else
{
return Files.GroupBy(item => item.CID).Select(grp => grp.First());
}
}
}
public ObservableCollection<FileData> Files
{
get; set;
}
public bool Unique
{
get
{
return unique;
}
set
{
unique = value;
RaisePropertyChanged("FilteredFiles");
}
}
绑定到 FilteredFiles
,当您从集合中 add/remove 时,只需调用 RaisePropertyChanged("FilteredFiles")
通知 UI。
你应该在某处有原始集合的引用,并在那个集合上进行所有计算。
例如,您可以有一个方法,只要选中或取消选中 CheckBox 就会调用该方法,并且该方法 filter/group 是原始集合。
// Simplified properties
private IEnumerable<FileData> FileRecordCollection;
public ObservableCollection<FileData> FileRecord { get; set; }
// Event handlers for the CheckBoxes
private void TID_CheckBox_Checked(object sender, RoutedEventArgs e)
{
UpdateFileRecord();
}
private void TID_CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
UpdateFileRecord();
}
// etc.
// Method that updates FileRecord
private void UpdateFileRecord()
{
IEnumerable<FileData> groupedCollection = FileRecordCollection;
if (TID_CheckBox.IsChecked)
groupedCollection = groupedCollection.GroupBy(item => item.TID).Select(grp => grp.First());
if (CID_CheckBox.IsChecked)
groupedCollection = groupedCollection.GroupBy(item => item.CID).Select(grp => grp.First());
// etc.
FileRecord = new ObservableCollection<FileData>(groupedCollection);
}
这不是最佳选择,但我现在想不出更好的(性能方面)。