为什么加载事件的组合框不保存列表

本文关键字:保存 列表 组合 加载 事件 为什么 | 更新日期: 2023-09-27 18:17:00

我有一个类,说类A,我已经在构造函数中初始化了一个列表(我使用HashSet),以便在整个程序中访问它。

在comboBox的Loaded事件中添加列表中的项目。当我在加载事件后使用保存的列表时,我发现它不包含我添加的数据。

这个东西是正常的加载事件?有人能告诉我如何保存列表中添加的数据(我使用HashSet)在加载事件?我的代码是:

 static HashSet < string > listOfUpdatedUIElement = new HashSet < string > ();
 static HashSet < string > storeUpdatedUIElement = new HashSet < string > ();
  //This in constructor
 GenerateParametersPreview() 
 {
     storeUpdatedUIElement = null;
 }

 public Grid simeFunction() {
     ComboBox cmb = new ComboBox();
     cmb.Loaded += (o3, e) => {
         foreach(string atrb in listOfUpdatedUIElement) //I have seen on debugging the data are updated in listOfUpdatedUIElement 
             {
                 storeUpdatedUIElement.Add(atrb);
             }
     };
     foreach(string atrb in storeUpdatedUIElement) //Here storeUpdatedUIElement hashset contains nothing inside
         {
             cmb.Items.Add(atrb);
         }
     Grid.SetColumn(cmb, 1);
     comboRowGrid.Children.Add(cmb);
     Grid.SetRow(comboRowGrid, 0);
     bigGrid.Children.Add(comboRowGrid); //suppose ihad created this bigGrid and it will dispaly my comboBox
     return (bigGrid);
 }

为什么加载事件的组合框不保存列表

事件是事件驱动编程范例的主要工具。

在事件驱动编程中,您不确定何时以及是否有一些条件发生了变化(例如某些ComboBox最终是否加载),您正在对有关该变化引发事件的通知做出反应。

意思是

cmb.Loaded += (o3, e) =>
       {
         foreach(string atrb in listOfUpdatedUIElement)//I have seen on debugging the data are updated in listOfUpdatedUIElement 
         {
             storeUpdatedUIElement.Add(atrb);
         }
     };

不会(至少不可能)在

之前执行。
 foreach(string atrb in storeUpdatedUIElement) //Here storeUpdatedUIElement hashset contains nothing inside
 {
     cmb.Items.Add(atrb);
 }

这就是为什么当循环枚举storeUpdatedUIElement时它是空的。

解决方案:

所以,如果你想在Loaded事件上更新你的ComboBox项目,你应该把所有相关的代码放在事件中:

cmb.Loaded += (o3, e) =>
{
     foreach(string atrb in listOfUpdatedUIElement)//I have seen on debugging the data are updated in listOfUpdatedUIElement 
     {
         storeUpdatedUIElement.Add(atrb);
     }
     foreach(string atrb in storeUpdatedUIElement) //Here storeUpdatedUIElement hashset contains nothing inside
     {
         cmb.Items.Add(atrb);
     }  
};

注::在这种情况下,您可能应该将这两个循环合并为一个:

     foreach(string atrb in listOfUpdatedUIElement)//I have seen on debugging the data are updated in listOfUpdatedUIElement 
     {             
         storeUpdatedUIElement.Add(atrb); // Remove it too if it is not used anywhere else
         cmb.Items.Add(atrb);
     }

simeFunction正在使用一个从未添加到表单中的新组合框。

当这个组合框被加载时,你希望你的列表被填充,因为它从来没有添加到你的表单,它永远不会被加载。