我正在尝试在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架构中有更好的获取子(dialogue)窗口的方法吗?