2011-09-29 155 views
0

*大家好,我是WP7开发新手。 (我习惯在android上工作),并且有一个基本的东西,我不知道该怎么做。 创建编程ApplicationBarIconButton列表与此:将参数传递给ApplicationBarIconButton.Click

for (int i=0; i<menus.Count(); i++) 
{ 

    ApplicationBarIconButton button = new ApplicationBarIconButton(); 
    button.IconUri = new Uri(menus.ElementAt(i).Element("ImageUrl").Value.Trim(),UriKind.Relative); 
    button.Text = menus.ElementAt(i).Element("Title").Value.Trim(); 
    button.Click += new EventHandler(button_clicked); 
    ApplicationBar.Buttons.Add(button); 
} 

,我想的是,button_clicked方法可以检索按钮的I值。 这怎么可能? 感谢

回答

2

我被@Enigmativity殴打了,但他的回答可能仍然不正确。根据我的经验,我发现你需要克隆迭代的i变量,否则在点击事件中,i将是最后一个值。如果他不工作试试这个(再次使用兰巴功能)

for (int i=0; i<menus.Count(); i++){ 
     ApplicationBarIconButton button = new ... 
     ... 
     var cloned = i; 
     button.Click += (sender, e) => { 
      sometTextBlock.Text = String.Format("App Button {0} pressed.", cloned); 
     }; 
    } 

干杯, 铝。

+0

谢谢你赶上我。感到愚蠢。 : -/ – Enigmativity

+0

非常感谢LOT ajmccall! – VinceFR

0

你可以这样做:

for (int i=0; i<menus.Count(); i++) 
{ 
    ApplicationBarIconButton button = new ApplicationBarIconButton(); 
    button.IconUri = new Uri(menus.ElementAt(i).Element("ImageUrl").Value.Trim(),UriKind.Relative); 
    button.Text = menus.ElementAt(i).Element("Title").Value.Trim(); 
    var i2 = i; //Thanks to `ajmccall` - I forgot this. 
    button.Click += (s, e) => 
    { 
     // the variable `i2` is accessible now. 
    }; 
    ApplicationBar.Buttons.Add(button); 
} 

而不是调用方法来处理点击就可以使用lambda,仍然可以访问i(通过本地副本i2)。如果需要,您可以调用任何传递i2作为参数的方法。

0

实现此目的的一种集成方式是通过使用MVVM框架中的命令。 与应用程序栏按钮/菜单项授予它有点棘手,但比操纵页面上的UI元素更加灵活。

查找范围到MVVM光(http://mvvmlight.codeplex.com)或进一步与Calburn.Micro的喜欢(http://caliburnmicro.codeplex.com/)

对于应用程序栏的数据绑定你将需要进一步谷歌(在链接失去了链接)