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

据我了解,当从可视树中卸载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;
        }
    }

最佳答案

该 View 在卸载后即从“ Activity View ”(在ViewManager内部)中删除。它将 View 模型保存在内存中,以便再次加载时不会改变当前未使用 View 的事实。

一种解决方案是创建自己的IViewManager(所有内容都可以在Catel中插入),然后可以以某种方式创建“阈值时间段”,在该时间段中, View 并未真正删除,因此有机会重新加载 View 。

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

关于c# - ViewManager.GetViewsOfViewModel始终返回null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31710049/

10-11 05:05