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