Составной вид-Вид уже существует в области ошибка


Я работаю над приложением WPF/Prism 4/AvalonDoc.

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

Я поместил область на вид и загрузил подвид в эту область с помощью regionManager.Метод RegisterViewWithRegion из конструктора ViewModel" master".

Это работает так же, как и ожидалось, когда загружается только один экземпляр представления. Но когда я ... открывая второй экземпляр этого экрана (он загружен как DocumentContent в DocumentPane AvalonDock), я получаю ошибку "View already exists in region".

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

2 2

2 ответа:

Боюсь, что у вас не может быть нескольких регионов с одинаковым названием. Я бы предпочел не разделять представления, когда модель представления усложняется. Модель представления можно разделить на несколько специализированных моделей представления.

Пример. У вас есть управление пользователями. Одна модель представления-это список всех пользователей. Этот список содержит модели представлений пользователей. И каждая модель представления пользователя содержит экземпляр модели представления прав пользователя, которая сама по себе снова является списком моделей представления, представляющих только одно право пользователя. Так логика представления специального права пользователя входит в соответствующую модель представления, а не в" главную " модель представления списка пользователей. Таким образом, вы можете разделить свои проблемы на различные модели представления.

Привязка к этим моделям представления так же проста, как и наличие только одной модели представления. Просто путь становится немного длиннее. Если контекст данных является моделью представления userlist из приведенного выше примера, вы можете иметь путь привязки, например CurrentUserVM.UserRightsVM, чтобы получить список пользователей права.

Если вы используете MEF и ваш взгляд является синглетным, то есть

[PartCreationPolicy(CreationPolicy.Shared)]

И ваш INavigationAware возврат false on

public override bool IsNavigationTarget(NavigationContext navigationContext)

{return false;}

Вы получите эту ошибку.

Изменить [PartCreationPolicy(CreationPolicy.Shared)] на [PartCreationPolicy(CreationPolicy.NonShared)]

И вы закончили.