【问题标题】:Toggle distinct and actual items in list切换列表中不同的和实际的项目
【发布时间】:2015-07-28 16:07:25
【问题描述】:

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 唯一复选框,那么网格应该得到如此正确的结果。

如何做到这一点?请帮忙。

【问题讨论】:

    标签: c# .net wpf mvvm wpf-4.0


    【解决方案1】:

    当我想过滤这样的集合时,我有一个这样的属性:

    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,当您从集合中添加/删除时,只需调用RaisePropertyChanged("FilteredFiles") 来通知用户界面。

    【讨论】:

      【解决方案2】:

      您应该在某处拥有原始集合的引用,并在该集合上进行所有计算。

      例如,您可以拥有一个在 CheckBox 被选中或未选中时调用的方法,并让该方法过滤/分组原始集合。

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

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

      【讨论】:

        猜你喜欢
        • 2018-09-10
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 2018-11-24
        • 2014-04-06
        相关资源
        最近更新 更多