WPF:Unity:关闭后重用窗口

时间:2012-04-25 12:10:52

标签: wpf mvvm unity-container

在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 中是否有任何解决办法可以再次获取窗口实例。

2 个答案:

答案 0 :(得分:0)

这一行是你的问题:

return new RelayCommand(RemoteViewExecute, CanRemoteViewExecute); 

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

答案 1 :(得分:0)

您应该使用LifetimeManager注册视图,以便只创建一个实例。请看Using Lifetime Managers