2010-01-07 56 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

對不起,也許我不是很配合我的問題。其實這個代碼編譯OK。我在循環中查詢每條特定記錄時遇到問題。謝謝,我現在要糾正我的問題。 – rem

回答

3

它看起來像你需要使用FindName採取ShowAvaQu對象的序列,把它變成的MyCustControl序列,和更新每個控件的狀態根據每個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; 
      } 
     } 
    }