在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 中是否有任何解决办法可以再次获取窗口实例。
答案 0 :(得分:0)
这一行是你的问题:
return new RelayCommand(RemoteViewExecute, CanRemoteViewExecute);
每次调用Get命令时,基本上都是在创建一个新视图。解决此问题的方法是将一个变量放在GET语句之外,该变量的范围是ViewModel级别。让它存储对视图的引用并返回该引用,而不是每次都创建一个新的引用。请查看Singleton pattern,了解如何做到最好。
答案 1 :(得分:0)
您应该使用LifetimeManager注册视图,以便只创建一个实例。请看Using Lifetime Managers。