将参数传递给ApplicationBarIconButton.Click

时间:2011-09-29 10:38:29

标签: c# windows-phone-7 event-handling

*大家好, 我是WP7 dev的新手。 (我习惯在android上工作)并且有一个基本的东西,我不知道该怎么做。 我用编程方式创建了一个ApplicationBarIconButton列表:

    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值。 这怎么可能? 感谢

3 个答案:

答案 0 :(得分:2)

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

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);
        };
    }

干杯, 人

答案 1 :(得分: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的方法作为参数。

答案 2 :(得分:0)

实现这一目标的一种综合方法是通过在MVVM框架中使用命令。 使用应用栏按钮/菜单项时,它比操作页面上的UI元素更棘手但更灵活。

查看MVVM指示灯(http://mvvmlight.codeplex.com)或进一步了解Calburn.Micro(http://caliburnmicro.codeplex.com/)

对于应用程序栏数据绑定,您需要进一步谷歌(在mo处丢失链接)