嗯,我有点奇怪的问题,但我会尽力说明,因为我花了最近几天试图寻找解决方案但失败了。
在我的应用程序中,我有一个Windows窗体,其中包含许多像控件一样显示Employee's
数据。自从我的应用程序开发开始以来,我使用了一种奇怪的方式来保持UI更新为Employee
实体的任何更改,我将在下面的代码中演示。
Company company = new Company();
public Form1()
{
InitializeComponent();
company.Name = "Company Name";
company.Employees = employees;
this.Controls.Add(new EmployeeTile {Tag = company.employees[0]}); //I tag every tile with an employee from the array.
this.Controls.Add(new EmployeeTile {Tag = company.employees[1]}); //I tag every tile with an employee from the array.
this.Controls.Add(new EmployeeTile {Tag = company.employees[2]}); //I tag every tile with an employee from the array.
this.Controls.Add(new EmployeeTile {Tag = company.employees[3]}); //I tag every tile with an employee from the array.
//Then at the Employee Tile i have a timer which runs every couple of seconds and updates it self from the Tag object.
//If any change made to the corresponding employee in the array it will be applied to the Tag of the Tile too.
}
这种方式运行良好,直到我使用自动映射器自动将更改应用于Employees
var comp = new Company()
{
Name = "Company Name",
Employees = /*NEW EMPLOYEE ARRAY WITH THE SAME COUNT AND EVERY THING BUT UPDATED VALUES*/
}
Mapper.Map<Company, Company>(/*FROM THE COMPANY OBJECT I NEWELY CREATED*/ comp, company /*TO THE EXISTING ONE*/);
一旦我这样做,ui就不再更新,好像某种方式Tag
和它的相应数组成员之间的链接不再存在。尽管automapper的这种重载不应该创建新对象,只是将值复制到现有对象。
EmployeeTileControl
public EmployeeTile()
{
InitializeComponent();
//TIME USING REACTIVE EXTENSIONS.
Observable.Interval(TimeSpan.FromSeconds(1), new ControlScheduler(this)).Subscribe(_ =>
{
Employee employee = Tag as Employee;
if (null != employee)
{
this.lblEmployeeName.Text = string.Format("Name: {0}", employee.Name);
this.lblEmployeeAge.Text = string.Format("Age: {0}", employee.Age);
}
//SO IT KEEPS UPDATING THE UI EVERY 1 SECOND WITH THE INFO FROM THE TAG.
//AS IT SUPPOSED THAT THIS TAG IS REFLECTING THE `ORIGINAL` EMPLOYEE INSTANCE FROM THE ARRAY.
//SO IT MUST BE UPDATED WHEN EVERY THE ORIGINAL INSTANCE IS UPDATED.
});
}
NB:我是一个非常新的程序员,所以我可能会用错误的术语提到某些东西,我希望你纠正我。标题可能也是非常错误的,但我不知道我应该怎么称呼它。