通用 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)
};

通用 UI 更新方法

var control = this.Controls.Find(model.ControlId, true).FirstOrDefault() as model.TypeOfControl.GetType()

上面的代码给出了一个错误,因为as运算符期望在 as 关键字 not 和表达式之后有一个类型。

从 C# 规范:

在形式为 E 作为 T 的操作中,E 必须是表达式,T 必须是引用类型、已知为引用类型的参数类型或可为 null 的类型。

您可以使用 FirstOrDefault 筛选Controls集合。我尝试了下面的代码,它适用于您提供的数据,正确设置了TextBoxText属性。

 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);
 }