1

在 ShellViewModel 我有下面的命令绑定打开一个新窗口“远程视图”

public ICommand RemoteViewCommand
{
    get { return new RelayCommand(RemoteViewExecute, CanRemoteViewExecute); }
}

private void RemoteViewExecute()
{
    if (!CanRemoteViewExecute())
    {
        return;
    }


    var shellRemoteView = Application._Container.Resolve<ShellRemoteView>();
    if (_ShellRemoteView.DataContext==null)
        _ShellRemoteView.DataContext = Application._Container.Resolve<ShellRemoteViewModel>();        

    shellRemoteView.Show();
}

在启动时,我已经使用生命周期管理器注册了“ShellRemoteView”和“ShellRemoteViewModel”以拥有单例实例。

_Container.RegisterType<ShellRemoteView>(new ContainerControlledLifetimeManager());
_Container.RegisterType<ShellRemoteViewModel>(new ContainerControlledLifetimeManager());

当 shellRemoteView.Show() 执行并关闭表单时,再次调用 shellRemoteView.Show() 时出现无效操作异常:无法设置可见性或在窗口关闭后调用 Show、ShowDialog 或 WindowInteropHelper.EnsureHandle。

如果关闭了,Unity 中是否有任何解决方法可以再次获取窗口实例

4

2 回答 2

0

您应该向LifetimeManager注册您的视图以仅创建一个实例。查看使用终身管理器

于 2012-04-25T13:44:32.107 回答
0

这条线是你的问题:

return new RelayCommand(RemoteViewExecute, CanRemoteViewExecute); 

基本上,每次调用 Get 命令时都会创建一个新视图。解决此问题的方法是将一个变量放在您的 GET 语句之外,该语句的范围是 ViewModel 级别。让它存储对视图的引用并返回该引用,而不是每次都创建一个新引用。查看Singleton 模式,了解如何最好地做到这一点。

于 2012-04-25T12:14:12.410 回答