通用 UI 更新方法
本文关键字:新方法 更新 UI 通用 | 更新日期: 2023-09-27 18:32:15
我目前正在 C# 中使用 async 和 await,我想创建一个更新 UI 的方法,而不会遇到跨线程更新的问题。这就是我目前所拥有的
型号类别:
public class UIModel
{
public string ControlId { get; set; }
public Type TypeOfControl { get; set; }
public string PropertyName { get; set; }
public object Data { get; set; }
public Type TypeOfData { get; set; }
}
UI 更新程序方法:
private void UIUpdater(UIModel model)
{
var control = this.Controls.Find(model.ControlId, true).FirstOrDefault() as model.TypeOfControl.GetType(); // <- not valid
// set control's model.PropertyName using model.Data
}
但是我似乎无法使该方法正常工作,如何根据UIModel中定义的控件类型强制转换通用控件,例如文本框或DataGridView。
以及如何根据 UIModel 中定义的属性名称设置该控件的属性?
UIModel的例子:
new UIModel()
{
ControlId = "textBox1",
TypeOfControl = typeof(TextBox),
PropertyName = "Text",
Data = "The quick brown fox jumps over the lazy dog.",
TypeOfData = typeof(string)
};
new UIModel()
{
ControlId = "button1",
TypeOfControl = typeof(Button),
PropertyName = "Enabled",
Data = false,
TypeOfData = typeof(bool)
};
var control = this.Controls.Find(model.ControlId, true).FirstOrDefault() as model.TypeOfControl.GetType()
上面的代码给出了一个错误,因为as
运算符期望在 as
关键字 not 和表达式之后有一个类型。
从 C# 规范:
在形式为 E 作为 T 的操作中,E 必须是表达式,T 必须是引用类型、已知为引用类型的参数类型或可为 null 的类型。
您可以使用 FirstOrDefault
筛选Controls
集合。我尝试了下面的代码,它适用于您提供的数据,正确设置了TextBox
的Text
属性。
var result = this.Controls.Find(model.ControlId, true).FirstOrDefault(x => x.GetType() == model.TypeOfControl);
PropertyInfo prop = result.GetType().GetProperty(model.PropertyName, BindingFlags.Public | BindingFlags.Instance);
if (null != prop && prop.CanWrite)
{
prop.SetValue(result, model.Data, null);
}