在这里,我再次尝试为Windows Phone 8发现C#编码的美丽世界!
这一次,我的问题是:
我通常使用我的应用程序填充了一个XML文件。让我们承认,几分钟后,XML文件如下所示:
<itemList>
<Item>
<Name>Item Name</Name>
//Other Item children elements here
</Item>
<Item>
<Name>Item 2 Name</Name>
//Other Item children elements here
</Item>
</itemList>
我使用文件流和XDocument变量成功提取了文件中包含的所有信息,然后使用这种代码将这些信息存储在字符串数组中:
string[] Names;
Names = xDoc.Descendants("Name").Select(o => o.Value).ToArray();
//I made the same thing for every element contained in the Items elements.
此字符串数组用于使用for循环动态创建按钮:
for (int i = 0; i < Names.Length; i++)
{
Button dynamicButton = new Button();
dynamicButton.Content = Names[i];
//other stuff on the button
ListOfButtons.Children.Add(dynamicButton); //ListOfButton is a StackPanel.
}
这很有效,我得到了一个好名字的按钮列表。我现在要做的是制作动态点击事件,它应该使用XML中的其他信息。例如,如果用户单击“项目2”按钮,则应显示名为“项目2”的项目的其他元素。
我试图在for循环中添加它:
dynamicButton.Click += (s, e) => resume(Names[i], Element2[i], Element3[i]);
但这显然不起作用,因为我的最大值是因为它增加了它。所以,当我点击任何一个按钮时,我遇到了一个超出范围的异常。即使它没有出来,点击第1项按钮也会显示数组中包含的最后一个元素的信息。
所以,我正在寻找的是一种让每个按钮在点击时都能显示自己的信息的方法。我不知道我是否能很好地解释英语不是我的主要语言,如果需要可以提出更多细节。
谢谢!
答案 0 :(得分:1)
使用MVVM的方法会更优雅,但为了简单起见,我将继续使用您的代码隐藏。
您需要的是一种在每个按钮上存储一些额外数据供以后使用的方法。您可以使用Tag
属性。让我们假设您有一个名为Data的类,它将包含您需要的所有其他数据。创建按钮时,请指定Tag
dynamicButton.Tag = new Data{...} //custom data class containing the needed data from Names[i], Element2[i], etc.
然后你可以像点击这样使用点击处理程序中的数据
dynamicButton.Click += (s, e) =>
{
var button = s as Button;
var data = button.Tag as Data;
//do whatever you want with the data
}