2015-07-28 2 views
1

FileRecord est la collection observable qui est liée à ma base de données wpf dans le modèle MVVM.Bascule les éléments distincts et réels dans la liste

J'ai une case à cocher pour chaque colonne au-dessus de ma grille de données. Le nom de la case à cocher est "SelectUnique - Columnname--". Lorsque je clique sur ces cases, il doit afficher des valeurs uniques pour la colonne de ma grille.

Lorsque je clique sur case à cocher unique pour tid, je dessous la logique

var grpd = FileRecord.GroupBy(item => item.TID).Select(grp => grp.First()); 
FileRecord= new ObservableCollection<FileData>(grpd); // will refresh the grid. 

Puis à nouveau Lorsque je clique sur case à cocher unique pour CId, je fais ci-dessous la logique

var grpd = FileRecord.GroupBy(item => item.CID).Select(grp => grp.First()); 
    FileRecord= new ObservableCollection<FileData>(grpd);// will refresh the grid. 

et ainsi de suite. Dans ce cas, par exemple, si je fais une sélection unique pour toutes mes colonnes, alors à nouveau Si je veux désélectionner la case de manière aléatoire (pas dans l'ordre que j'ai choisi les cases à cocher), je voudrais annuler ce que j'ai fait pour cette colonne . Par exemple, si je désélectionne CID case à cocher unique, alors la grille devrait si bien résultat.

Comment réaliser ceci? S'il vous plaît aider.

Répondre

1

Quand je veux filtrer une collection comme ça, j'ai une propriété comme ceci:

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

Bind à FilteredFiles et lorsque vous ajoutez/retirer de la collection suffit d'appeler RaisePropertyChanged("FilteredFiles") pour notifier l'interface utilisateur.

0

Vous devriez avoir une référence de la collection d'origine quelque part, et faire tous les calculs sur celle-ci. Par exemple, vous pouvez avoir une seule méthode qui est appelée chaque fois qu'un CheckBox est coché ou décoché, et que cette méthode filtre/groupe la collection d'origine.

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

Ce n'est pas exactement optimal, mais je ne peux pas penser à quelque chose de mieux (en termes de performances) en ce moment.