*大家好!我是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值。这怎么可能?由于
我被@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)