我正在尝试使用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/