通用UI更新方法

时间:2014-11-27 02:34:31

标签: c# winforms asynchronous async-await

我目前正在使用异步并等待C#,我想创建一个更新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)
};

1 个答案:

答案 0 :(得分:1)

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

上面的代码会给您一个错误,因为as运算符需要as关键字之后的类型而不是表达式。

来自C#规范:

  

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

您可以使用Controls过滤FirstOrDefault集合。我尝试了下面的代码,它可以处理您提供的数据,正确设置Text的{​​{1}}属性。

TextBox