传递一个参数给ApplicationBarIconButton.Click

本文关键字:参数 ApplicationBarIconButton Click 一个 | 更新日期: 2023-09-27 18:10:13

*大家好!我是WP7开发的新手(我习惯在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值。这怎么可能?由于

传递一个参数给ApplicationBarIconButton.Click

我被@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);
        };
    }

欢呼,Al .

你可以这样做:

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作为参数传递的任何方法。

实现这一目标的综合方法是在MVVM框架中使用命令。对于应用程序栏按钮/菜单项来说,这有点棘手,但比在页面上操作UI元素要灵活得多。

查看MVVM light (http://mvvmlight.codeplex.com)或进一步使用Calburn等。微(http://caliburnmicro.codeplex.com/)

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