ViewManager.GetViewsOfViewModel 总是 return 空

ViewManager.GetViewsOfViewModel always return null

我正在尝试使用 Catel ViewManager 注册和获取视图,但我没有从 ViewManager.GetViewsOfViewModel

获取视图

据我了解,当 UserControl 从可视化树中卸载时,它会被销毁,但这不应该发生,因为我使用 CloseViewModelOnUnloaded = false;

我做了一个小例子来演示这个问题。 TestApp

 public void ShowDocumentWindow<TViewModel>(object model = null) where TViewModel : DocumentItemViewModel
    {
        IViewModel vm = null;

        if (model != null)
        {
            vm = this.viewModelManager.GetViewModelsOfModel(model).FirstOrDefault();
        }

        if (vm == null)
        {
            var viewModel = this.viewModelFactory.CreateViewModel<TViewModel>(model);
            var viewType = this.viewLocator.ResolveView(viewModel.GetType());

            var view = Activator.CreateInstance(viewType, viewModel);

            this.documentHost.Items.Add(new DocumentPanel
            {
                Content = view,
                IsActive = true,
                MDIState = MDIState.Normal
            });

            this.viewManager.RegisterView((IView)view); // Registering 
            this.viewModelManager.RegisterModel(viewModel, model);
        }
        else
        {
            var view = this.viewManager.GetViewsOfViewModel(vm).FirstOrDefault() as UserControl; \ but this I get null

            var index = this.documentHost.Items.FindIndex(x =>
            {
                var documentPanel = x as DocumentPanel;
                if (documentPanel != null)
                {
                    return Equals(documentPanel.Content, view);
                }

                return false;
            });

            this.documentHost.SelectedTabIndex = index;
        }
    }

视图在卸载后立即从 "active views"(在 ViewManager 内)中删除。它将其视图模型保存在内存中以备再次加载时不会改变视图当前未被使用的事实。

一个解决方案是创建您自己的 IViewManager(在 Catel 中一切都是可插入的),然后您可以以某种方式创建一个 "threshold period" 视图并没有真正被删除,因此它们有机会重新加载。

但是...我认为最好将状态存储在服务/内存对象中并在您再次加载视图时恢复它并创建一个新的 VM。