2012-02-24 39 views
2

我遇到了將擴展事件添加到擴展器的問題。我的窗口上有擴展器,當我擴展擴展器時,所有其他擴展器都會關閉。我寫的功能,讓我這樣做,它的工作是正確的。問題是我有96個擴展器,我不想爲擴展添加96個事件,爲崩潰添加96個事件,所以我認爲我可以通過編程添加這個。以編程方式添加多個擴展器事件不會工作

看代碼:

private void InitExpanders() 
    { 
     var expanders = GetExpanders(); // List<Expander> - list of expanders 
     for (int i = 0; i < expanders.Count; i++) 
     { 
      if (i % 6 == 1) 
      { 
        expanders[i - 1].Expanded += new RoutedEventHandler(delegate(object sender, RoutedEventArgs args) 
        { 
         DisableBigExpanders(1); // problem is here! 
        }); 
      } 
     } 
    } 

此代碼工作正常,但對於每個擴展函數參數將是1 香港專業教育學院嘗試添加整數和增加它,但它不會起作用。

private void InitExpanders() 
    { 
     var expanders = GetExpanders(); 
     int x = 0; 
     for (int i = 0; i < expanders.Count; i++) 
     { 
      if (i % 6 == 1) 
      { 
        expanders[i - 1].Expanded += new RoutedEventHandler(delegate(object sender, RoutedEventArgs args) 
        { 
         DisableBigExpanders(x); 
        }); 
        x++; 
      } 
     } 
    } 

感謝您的回覆。

+0

有一個更好的方式來做到這一點:http://blogs.microsoft.co.il/blogs/tomershamam/archive/ 2008/08/04/LT-HOWTO-GT-創建-AN-膨脹機一組,而無需代碼-LT-HOWTO-gt.aspx – Joulukuusi 2012-02-25 16:39:29

回答

2

我懷疑你在委託中發現x總是它在循環中達到的最高值。這是由於編譯器實例化您定義的匿名方法的實例。它會查看哪些捕獲的委託外圍的外部變量,並決定它是否需要單獨的實例或是否可以使用單個實例。在這種情況下,您沒有捕獲的外部變量;因此,編譯器被允許使用委託的同一個實例,因此使用相同的x值。

要解決此問題,您只需在代理之前添加一個更細化的變​​量併爲其分配值x。這將工作:

private void InitExpanders() 
{ 
    var expanders = GetExpanders(); 
    int x = 0; 
    for (int i = 0; i < expanders.Count; i++) 
    { 
     if (i % 6 == 1) 
     { 
       int y = x++; 
       expanders[i - 1].Expanded += delegate 
       { 
        DisableBigExpanders(y); 
       }; 
     } 
    } 
} 

看到這裏的理論更多的信息:http://en.csharp-online.net/ECMA-334%3A_14.5.15.4_Anonymous_method_evaluation

相關問題