ViewManager.GetViewsOfViewModel始终返回null

时间:2015-07-29 20:02:05

标签: c# mvvm catel

我尝试使用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;
        }
    }

1 个答案:

答案 0 :(得分:1)

一旦卸载,视图就会从“活动视图”(ViewManager内部)中删除。它将视图模型保留在内存中以便再次加载它时不会改变视图当前未被使用的事实。

一个解决方案是创建自己的IViewManager(一切都可以在Catel中插入),然后你可以以某种方式创建一个“阈值期”,其中视图没有被真正删除,因此他们有机会重新加载。

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