Реализация диалога завершается неудачно, это уже логический дочерний элемент другого элемента - PullRequest
3 голосов
/ 13 января 2012

Я пытаюсь реализовать диалоговое окно в приложении WPF + PRISM + MVVM. на данный момент мне удалось создать пример сервиса, и каждый модуль может использовать этот сервис для отображения любого вида в окне, но проблема в этом очень необычная и не может заставить его работать.

Вот контракт с оконной службой.

public interface IUiDialogueService : IDisposable
{
    void Show<TView>(TView view) where TView : IViewModel;
}

public class UiDialogueService : IUiDialogueService, IDisposable
{
    private Window _dialogueWindow;

    #region Implementation of IUiDialogueService

    public void Show<TView>(TView view) where TView : IViewModel
    {
        _dialogueWindow = new Window
                              {
                                  SizeToContent = SizeToContent.WidthAndHeight,
                                  ResizeMode = ResizeMode.NoResize,
                                  ShowInTaskbar = false,
                                  Content = view.View
                              };
        _dialogueWindow.ShowDialog();
        _dialogueWindow = null;

    }
}

Вот как я могу получить доступ к моей оконной службе из модуля.

    private void OnStartWizard()
    {
        _dialogueService.Show(ServiceLocator.Current
                    .GetInstance<IOrgManagementOrganizatioSetupViewViewModel>());
    }

все работает хорошо, когда я впервые открываю окно, но после того, как я закрываю его и открываю то же или другое представление внутри окна, я возвращаюсь к следующему исключению

Указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключите его.

это исключение выдается следующим кодом.

        _dialogueWindow = new Window
                              {
                                  SizeToContent = SizeToContent.WidthAndHeight,
                                  ResizeMode = ResizeMode.NoResize,
                                  ShowInTaskbar = false,
                                  Content = view.View
                              };

Может ли кто-нибудь объяснить, что здесь происходит не так, и есть ли лучший способ получить дочернее (диалоговое) окно в MVVM architectur?

Ответы [ 2 ]

3 голосов
/ 13 января 2012

Попробуйте добавить следующий код перед последней строкой Show:

_dialogueWindow.Content = null;

Show теперь должно выглядеть так:

public void Show<TView>(TView view) where TView : IViewModel
{
    _dialogueWindow = new Window
                          {
                              SizeToContent = SizeToContent.WidthAndHeight,
                              ResizeMode = ResizeMode.NoResize,
                              ShowInTaskbar = false,
                              Content = view.View
                          };
    _dialogueWindow.ShowDialog();
    _dialogueWindow.Content = null;
    _dialogueWindow = null;
}
1 голос
/ 13 января 2012

Каждый элемент в WPF может принадлежать только одному родительскому элементу. Даже если элемент не отображается (или не отображается), отношения родитель-потомок остаются. Если вы хотите присвоить элементу новый родительский элемент, вам необходимо сначала удалить его из старого родительского элемента.

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

Лучший способ - убрать вид из окна (описано в ответе Даниэля Хилгарта). В качестве альтернативы вы можете проверить, есть ли у представления родительский элемент, и сначала вручную удалить его из этого родительского элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...