Как получить MasterView для DockPanel.

StatusIDPriorityType
Closed4919ВысокийВопрос
ProfileReply
Viktor SavitskiClient

Добрый день.
Как из ViewController для View, которая открыта в DockPanel, получить View, для которой данная DockPanel открыта?
Спасибо.

Replies

UserDescriptionPosted On
Александра ЗубрейAgent

Здравствуйте, Виктор.

Для решения Вашей проблемы нам понадобится некоторое время.

Постараемся дать ответ как можно быстрее.

Спасибо, Саша.

Александра ЗубрейAgent

Здравствуйте, Виктор.

Чтобы получить доступ к View, для которой открыта DockPanel через ViewController, можно воспользоваться следующей конструкцией:

	var viewDockPanel = Frame.View; // View панели
	var ifDockPanel = Frame.Context.ToString().Contains("DockPanel");	
	if (ifDockPanel)
	{
		var targetView = Frame.Application.MainWindow.View; // View, для которой открыта панель
	}

Если ваш вопрос был понят неверно или есть дополнительные вопросы, обращайтесь.

Спасибо, Саша.

Viktor Savitski

Добрый день, Саша.
К сожалению данное решение не работает для нас.
Наше приложение для Windows. Мы используем пользовательский интерфейс типа TabbedMDI.
И когда мы обращаемся к свойству Frame.Application.MainWindow.View мы получаем null.

Задача у нас такая: обновить Master форму, после завершения Бизнес-операции, которая была запущена в форме DockPanel.

В ходе разбирательства мы наткнулись на контроллер  ViewsRelationsController:
В нашем контроллере для View, которая отображается в DockPanel, в обработчике события завершения выполнения бизнес-операции Мы получаем ViewsRelationsController:

var viewsRelationsController = CurrentViewController.Frame.GetController<ViewsRelationsController>(); 

 foreach (var relation in viewsRelationsController.Relations)
            {
                //наш код
            }

но к сожалению в коллекции Relations нет ни одного элемента.

Если же данный код выполнить в контроллере Master View, В момент когда все панели уже созданы то в коллекции  Relations  можно увидеть элементы-связи.
Но в том то и дело, что обновление Master View мы должны запустить из контроллера Details View, где коллекция связей пустая.

Мы сделали пока частное решение:
В контроллере для Details View (DockPanel) создали статическое событие "Моя бизнес операция завершена".
В контроллере для Master View в обработчике данного события вызываем код:

void RefreshFromRelatedPanels(object sender, EventArgs e)
        {
            if (sender == null) return;
            View relatedView = (sender as LogicControllerBase).CurrentViewController.View;
            ViewsRelationsController viewsRelationsController = CurrentViewController.Frame.GetController<ViewsRelationsController>();
            foreach (var relation in viewsRelationsController.Relations)
            {
                if (relation.DetailsView == relatedView)
                {
                    CurrentViewController.View.ObjectSpace.Refresh();
                }
            }
        }

Но данное решение нам не нравится, по сути контроллер MasterView, ничего не должен знать о контроллере Details View.
А если нам понадобится реализовать подобный функционал в другом месте?
Хотелось бы получить какой то более гуманный способ узнать, какая же View является Master для View открытой в DockPanel

Спасибо, Виктор.


Александра ЗубрейAgent

Здравствуйте, Виктор.

На данный момент у нас действительно существуют проблемы с DockPanel

при работе с типом интерфейса UIType = TabbadMDI.

Эта проблема находится на этапе решения.

О результатах сообщим позже.

Спасибо, Саша.

 

Viktor Savitski

Добрый день.
Хочу поделиться нашим решением данной задачи:

1. Завели  Controller для панели, который должен хранить MasterFrame для  панели (DockPanelController):
    public Frame MasterFrame {get; set;}

2. Завели контроллер, в котором инициализируем свойство  MasterFrame  в контроллере DockPanelController:

        XafariDockingWindowController _xafariDockingWindowController;
        
        public override void OnActivated()
        {
            _xafariDockingWindowController = controller.Frame.GetController<XafariDockingWindowController>();
            if (_xafariDockingWindowController != null)
            {
                _xafariDockingWindowController.DockPanelFrameCreated += xafariDockingWindowController_DockPanelFrameCreated;
            }
        }
        public override void OnDeactivated()
        {
            if (_xafariDockingWindowController != null)
            {
                _xafariDockingWindowController.DockPanelFrameCreated -= xafariDockingWindowController_DockPanelFrameCreated;
            }
        }
        void xafariDockingWindowController_DockPanelFrameCreated(object sender, DockPanelItemEventArgs e)
        {
            var detialsDockPanelController = e.DockPanelItem.Frame.GetController<DockPanelController>();
            if (detialsDockPanelController != null)
            {
                detialsDockPanelController .MasterFrame = this.Frame;
            }

        }
3, Затем в контроллере для DockPanel мы получаем DockPanelController, а у него свойство MasterFrame. Пример:

              
public override void OnActivated()

               
  {

                              
 var _dockPanelController =
this.Frame.GetController<
DockPanelController>();

 
                            
   if (
_dockPanelController != null && _dockPanelController .MasterFrameForDetails != null)

                  
                             _dockPanelController .MasterFrameForDetails.View.ObjectSpace.Refresh();

                 } 

× This ticket is closed.