从其他类更新UI的最佳方法?

时间:2010-05-19 16:50:04

标签: c# winforms .net-3.5 user-interface

我有几个嵌套类,具有以下结构:

BackupLocation包含BackupClients列表

BackupClients包含BackupVersions列表

BackupVersions包含BackupFiles列表

在我的UI中 - 我使用BackupLocations填充组合框 - 并为客户端,版本和文件提供了多个列表框。

处理BackupLocations时 - 我可以轻松更新状态栏,因为这是UI创建的顶级类。但是,如何更新正在处理的每个文件的状态栏和进度条?由于BackupFiles是3级深,我无法看到任何更新UI的方法。文件的实际处理在BackupVersion类中 - 它加载其文件。

我认为它可能与活动和代表有关 - 但我不确定如何继续这一点,任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

我会使用事件并通过类冒泡它们。

基本上:

  • 使用可以处理您希望显示的特定状态更新的事件参数在每个类中创建一个事件。
  • 当推送更新时,请调用该事件
  • 从上面的类处理事件,将您想要的任何识别信息添加到事件参数中(例如:如果您想使用2或3个状态栏,请确定需要更新的状态栏 - 或者更确切地说更新发生的级别)
  • 使用新事件args向该类调用事件,依此类推。

在一个非常简单的代码示例中,请参阅下面的内容(无空检查等一般概念):

class A
{
    public A()
    {
        ExampleB.StatusUpdate += new EventHandler<ExampleArgs>(ExampleB_StatusUpdate);
    }

    void ExampleB_StatusUpdate(object sender, ExampleArgs e)
    {
        UpdateUI();
    }

    public B ExampleB { get; set; }

    public event EventHandler<ExampleArgs> StatusUpdate;

    protected virtual void OnChanged(ExampleArgs e)
    {
        if (StatusUpdate != null)
        {
            StatusUpdate(this, e);
        }
    }
}

class B
{
    public B()
    {
        ExampleC.StatusUpdate += new EventHandler<ExampleArgs>(ExampleC_StatusUpdate);
    }

    void ExampleC_StatusUpdate(object sender, ExampleArgs e)
    {
        OnChanged(e);
    }

    public C ExampleC { get; set; }

    public event EventHandler<ExampleArgs> StatusUpdate;

    protected virtual void OnChanged(ExampleArgs e)
    {
        if (StatusUpdate != null)
        {
            StatusUpdate(this, e);
        }
    }
}

class C
{
    public event EventHandler<ExampleArgs> StatusUpdate;

    protected virtual void OnChanged(ExampleArgs e)
    {
        if (StatusUpdate != null)
        {
            StatusUpdate(this, e);
        }
    }
}

class ExampleArgs : EventArgs
{
    public string StatusUpdate { get; set; }
}
相关问题