Где хранить ссылки (или список ссылок) на Presenter-ов
От: es3000  
Дата: 02.06.19 16:05
Оценка:
Добрый день!

Помогите пожалуйста разобраться в следующей ситуации.

Есть окно для обмена с кассами.
В нем отображается:
— список касс,
— кнопки "Выгрузить" и "Загрузить",
— рядом с каждой кассой две пиктограммы, первая обозначает результат последней выгрузки, вторая — результат загрузки.
Если результат успешный — пиктограмма выглядит как зеленый плюсик, если ошибка — красный восклицательный знак.

При щелчке мышкой на пиктограмме открывается новое окно с подробными результатами операции для соответствующей кассы.
Для одной кассы может быть открыто только два таки окна с подробными результатами: одно для выгрузки, второе — для загрузки.
Если такое окно уже открыто для какой то кассы, то при повторном щелчке на пиктограмме это окно должно переместиться на передний план.
Допустим, если в списке три кассы, то получается что всего может быть открыто всего шесть окон с подробными результатами.

Получается, что нужно где-то отслеживать какие окна уже открыты и хранить данные об этих открытых окнах.
Чтобы можно было их активизировать при необходимости.

Сейчас у меня пока сделано без отслеживания.
Сейчас окно списка касс имеет ссылку на связанный с ней презентер, при щелчке в окне на пиктограмме ему передается команда:
lCashListPresenter.ShowDetails(CashList.GetCurrentPos(), OperationType_Upload);

или
lCashListPresenter.ShowDetails(CashList.GetCurrentPos(), OperationType_Download);


В этом CashList-презентере срабатывает вот такой код:

class TCashListPresenter
{
    void ShowDetails (pCash, pOperationType)
    {
        lOperation = Controller.GetLastOperation(pCash, pOperationType);
        lPresenter = new TDetailsPresenter(pCash, lOperation);
        lPresenter.ShowWindow();
    }
}


То есть CashList-презентер создает Details-презентер и уже новый созданный Details-презентер открывает окно подробностей.
Получается, надо где-то хранить ссылки на презентеры-подробностей и переделать код вызова вот так:

class TCashListPresenter
{
    void ShowDetails (pCash, pOperationType)
    {
        lOperation = Controller.GetLastOperation(pCash, pOperationType);
        lPresenterFound = DetailsPresenterList.FindPresenter(pCash, lOperation);
    if (lPresenterFound = null)
            lPresenterFound = new TDetailsPresenter(pCash, lOperation);
        lPresenterFound .ShowWindow();
    }
}


Теперь вопросы.

1) Где надо создавать и хранить DetailsPresenterList?

Напрашивается, что хранить его можно прямо в CashList-презентере (в презентере списка касс), вот так:

class TCashListPresenter
{
    List<TDetailsPresenter> DetailsPresenterList;
    TCashListPresenter()
    {
        DetailsPresenterList = new List<TDetailsPresenter>;
    }
}


Но мне кажется это не правильно.
Так как вызвать окно подробностей для кассы теоретически можно и из другого места, например из главного окна.
А меню главного окна не имеет доступа к CashList-презентеру.

А тогда где создать этот список?
Какой объект должен быть ответственным за создание, хранение и уничтожение этого списка?

2) Как будет выполняться удаление из этого списка элементов — конкретных aDetailsPresenter — при закрытии соответствующего окна подробностей?
Ведь получается, что ни сам Details-презентер, ни соответствующее ему окно подробностей не знают об этом списке.
Не понятно, как при закрытии окна подробностей добраться до этого списка.
Какой объект должен отвечать за удаление элемента из этого списка?

Подскажите, пожалуйста!
Посоветуйте как это лучше сделать.
Отредактировано 02.06.2019 16:10 es3000 . Предыдущая версия . Еще …
Отредактировано 02.06.2019 16:09 es3000 . Предыдущая версия .
Отредактировано 02.06.2019 16:08 es3000 . Предыдущая версия .
Отредактировано 02.06.2019 16:06 es3000 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.