2010-01-07 4 views
0

В WPF приложения Я использую LINQ запрос для получения значений из ObservableCollection и обновить состояние некоторых объектов:Foreach петля через 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; 
      ... 
     } 

В самом деле, xyID является уникальным поле в этом ObservableCollection и его строковое значение соответствует имена объектов в XAML (эти объекты производятся от контроля клиента MyCustControl).

То, что я пытаюсь сделать, это:

(1) для перебора всех записей в _ShAvaQuCollection и, используя xyID поле, ссылка каждого конкретного объекты, используя shava в результате запроса к каждому из запись:

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

(2) и обновлять состояние объекта, используя другие значения из этой записи, например:

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

Все эти действия друг от друга работают хорошо, но я не могу совместить его с методом итерации рабочего, что-то вроде этого (это только идея, потому что мне не удалось получить compyleable код):

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

Пожалуйста, помогите мне организовать такую ​​итерацию в этом последнем фрагменте кода внутри цикла foreach. У меня возникают проблемы с пониманием того, как сделать запрос к каждой конкретной записи коллекции внутри цикла.

Я описал все выше, чтобы четко указать, что я намерен делать с результатами такого запроса внутри этого цикла.

+0

Какая ошибка у вас? –

+0

Извините, может быть, я не очень корыстно сформулировал свою проблему. Фактически, этот самый код компилируется ОК. У меня возникают проблемы с запросом каждой конкретной записи внутри цикла. Спасибо, теперь я исправлю свой вопрос. – rem

ответ

3

Похоже, что вам нужно взять последовательность ShowAvaQu объектов, превратить его в последовательность MyCustControl с помощью FindName и обновление статус каждого элемента управления на основе состояния каждого ShowAvaQu.

Во-первых, давайте ассоциировать статусы и элементы управления:

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

Затем перебирать эту последовательность, обновляя статусы по мере необходимости:

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

это выглядит правильно?

+0

Да, да. Я попробовал, и он работает нормально. Для меня это не только еще один способ сделать что-то, но и часть кода для изучения. Спасибо, Брайан! +1 – rem

1

Кажется, мне удалось это сделать (и это работает):

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; 
      } 
     } 
    } 
Смежные вопросы