Лучший способ обновить пользовательский интерфейс из других классов? - PullRequest
1 голос
/ 19 мая 2010

У меня есть несколько вложенных классов со следующей структурой:

BackupLocation содержит список клиентов BackupClient

BackupClients содержит список BackupVersions

BackupVersions содержит список файлов BackupFiles

В моем пользовательском интерфейсе - я заполняю поле со списком BackupLocations - и имею несколько списков для клиентов, версий и файлов.

При обработке BackupLocations - я могу легко обновить строку состояния, потому что это класс верхнего уровня, который создает пользовательский интерфейс. Но как я могу обновить строку состояния и индикатор выполнения для каждого обрабатываемого файла? Поскольку файлы BackupFiles имеют 3 уровня, я не вижу способа обновить пользовательский интерфейс. Фактическая обработка файлов находится в классе BackupVersion, который загружает свои файлы.

Я думаю, что это, вероятно, как-то связано с событиями и делегатами, но я точно не знаю, как поступить с этим, любая помощь будет оценена.

1 Ответ

4 голосов
/ 19 мая 2010

Я бы использовал события и раздувал их на уроках.

В основном:

  • Создайте событие в каждом классе с аргументами события, которые могут обрабатывать конкретное обновление статуса, которое вы хотите показать.
  • Когда пришло время отправить обновление, вызовите событие
  • Обработайте событие из класса над ним, добавив любую идентифицирующую информацию, которую вы хотите, к аргументам события (например: если вы хотите использовать 2 или 3 строки состояния, определите, какую строку состояния необходимо обновить - или, скорее, уровень, на котором произошло обновление)
  • Вызвать событие в классе, используя новые аргументы события и т. Д. И т. Д.

В очень упрощенном примере кода см. Ниже (без проверки нуля и т. Д., Только общая концепция):

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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...