2010-01-07 5 views
0

Dans l'application WPF J'utilise requête LINQ pour obtenir des valeurs de ObservableCollection et mettre à jour l'état de certains objets:boucle Foreach par ObservableCollection

var shava = from clc in _ShAvaQuCollection where clc.xyID == "x02y02" select clc; 

     switch (shava.First().Status) 
     { 
      case 1: 
       x02y02.Status = MyCustControl.Status.First; 
       break; 
      case 2: 
       x02y02.Status = MyCustControl.Status.Second; 
       break; 
      ... 
     } 

En fait, xyID est unique sur le terrain dans cette ObservableCollection et sa valeur de chaîne correspond à noms des objets en XAML (ces objets sont dérivés d'un contrôle client MyCustControl).

Ce que je suis en train de faire est:

(1) à itérer tous les enregistrements dans _ShAvaQuCollection et, à l'aide de champ xyID, référence chaque objet particulier, à l'aide shava à la suite de la requête à chacun des enregistrer:

MyCustControl sc = (MyCustControl)this.FindName(shava.First().xyID); 

(2) et mettre à jour l'état de l'objet, à l'aide d'autres valeurs de cet enregistrement, par exemple:

  switch (shava.First().Status) 
     { 
      case 1: 
       sc.Status = MyCustControl.Status.First; 
       break; 
      case 2: 
       sc.Status = MyCustControl.Status.Second; 
       break; 
      ... 
     } 

Toutes ces actions fonctionnent en dehors bien, mais je ne peux pas le combiner à une méthode itération de travail, quelque chose comme ça (il est une idée que, parce que je ne l'ai pas réussi à obtenir un code compyleable):

public void ReadingCollection(System.Collections.Generic.IEnumerable<ShowAvaQu> coll) 
{ 
    foreach (var xyid in coll) 
     { 
      //do my actions (1) and (2) 
     } 
} 

S'il vous plaît, aidez-moi à organiser une telle itération dans ce dernier morceau de code à l'intérieur de la boucle foreach. J'éprouve des problèmes avec comprendre comment faire une requête à chaque enregistrement particulier de la collection à l'intérieur de la boucle.

J'ai décrit tout ce qui précède juste pour clarifier ce que j'ai l'intention de faire avec les résultats d'une telle requête à l'intérieur de cette boucle.

+0

Quelle erreur obtenez-vous? –

+0

Désolé, peut-être que je n'ai pas formulé très coorectement mon problème. En fait, ce code compile bien. Je rencontre des problèmes avec chaque enregistrement particulier dans la boucle. Merci, je vais maintenant corriger ma question. – rem

Répondre

3

Il semble que vous devez prendre une séquence de ShowAvaQu objets, la transformer en une séquence de MyCustControl en utilisant FindName et mise à jour l'état de chaque contrôle en fonction de l'état de chaque ShowAvaQu.

Tout d'abord, associer les statuts et contrôles:

var shavaControls = 
    from shava in coll 
    select new 
    { 
     Status = shava.Status, 
     Control = (MyCustControl) this.FindName(shava.xyID) 
    }; 

Ensuite, itérer cette séquence, mise à jour des statuts nécessaire:

foreach(var shavaControl in shavaControls) 
{ 
    switch(shavaControl.Status) 
    { 
     case 1: 
     shavaControl.Control.Status = MyCustControl.Status.First; 
     break; 
     case 2: 
     shavaControl.Control.Status = MyCustControl.Status.Second; 
     break; 
     //... 
    } 
} 

Est-ce correct?

+0

Oui, c'est le cas. Je l'ai essayé et cela fonctionne bien. Pour moi, ce n'est pas seulement une autre façon de faire les choses, mais aussi le morceau de code à apprendre. Merci, Bryan! +1 – rem

1

Il semble que je réussi à le faire (et ça marche):

public void ReadingCollection(System.Collections.Generic.IEnumerable<ShowAvaQu> coll) 
    { 
     foreach (var id in coll) 
     {    
      MyCustControl sc = (MyCustControl)this.FindName(id.xyID); 
      switch (id.Status) 
      { 
       case 1: 
        sc.Status = MyCustControl.Status.First; 
        break; 
       case 2: 
        sc.Status = MyCustControl.Status.Second; 
        break; 
       case 3: 
        sc.Status = MyCustControl.Status.Third; 
        break; 
       default: 
        break; 
      } 
     } 
    }