为每个列表生成按钮
本文关键字:按钮 列表 | 更新日期: 2023-09-27 18:17:41
我在一个静态类(用作全局类)中有一系列列表
public static class globalClass
{
public static List<classA> aList = new List<classA>();
public static List<classB> bList = new List<classB>();
public static List<classC> cList = new List<classC>();
}
我想为每个列表生成一个xaml按钮,并且被告知反射是一个坏主意。这就是我使用反射来处理它的方法。
//get FieldInfo for globalClass
TypeInfo typeInfo = IntrospectionExtensions.GetTypeInfo(typeof(globalClass));
IEnumerable<FieldInfo> FieldInfoList = typeInfo.DeclaredFields;
foreach (FieldInfo f in FieldInfoList)
{
//Only look at lists
if(f.FieldType.ToString().StartsWith("System.Collections.Generic.List`1")){
StackPanel s = new StackPanel();
s.Orientation = Orientation.Horizontal;
TextBlock textBlock = new TextBlock();
textBlock.FontSize = 45;
textBlock.Text = f.Name.ToString();
Button addButton = new Button();
addButton.Click += delegate(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(addObjectToLibraryPage), f);
};
addButton.Margin = new Thickness(10);
addButton.Name = "addButton";
addButton.Content = "add";
Button deleteButton = new Button();
deleteButton.Click += delegate(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(deleteObjectFromLibraryPage), f);
};
deleteButton.Margin = new Thickness(10);
deleteButton.Name = "deleteButton";
deleteButton.Content = "delete";
s.Children.Add(addButton);
s.Children.Add(deleteButton);
//add new textBlock and stackpanel to existing xaml
stackPanel.Items.Add(textBlock);
stackPanel.Items.Add(s);
}
}
有更干净的方法吗?我希望能够传递实际的列表,而不是FieldInfo。
我不想单独处理每个列表,因为我最终可能会有20多个列表,并且我以非常相似的方式使用它们。
我正在尝试做的一个例子:
假设我有一个杂货/营养应用程序,我希望用户能够记录他们从商店吃了什么/需要什么。他们可以从水果、蔬菜、肉类、乳制品、糖果、罐头食品等列表中选择。
但是,我希望他们能够(作为一个高级选项)能够编辑可能的水果列表,或任何其他食物类别。我不想只列出"食物",因为肉类会记录最低烹饪温度之类的东西。
因此,在高级选项下,我希望每个类别有两个按钮(添加到水果,从水果中删除)。理论上,我还可以添加一个导入/导出页面,这样我就可以与其他人分享我的水果列表了。
指向使用超类的答案似乎不起作用。参见:c#多态性简单问题
您可以创建一个包含所有现有列表的列表。然后可以遍历列表以创建按钮。如果您希望为每个列表维护一个标签,您可以使用一个字典,其中键作为标签文本,列表作为值。
除了建议的解决方案,请考虑Sayse给出的评论。