在列表中切换不同的和实际的项目

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);
}

这不是最佳选择,但我现在想不出更好的(性能方面)。