如何导航回到 Caliburn Micro WPF 中的上一个视图?
How to navigate back to a previous view in Caliburn Micro WPF?
我是 Caliburn Micro 框架的新手,正在开发一个具有列表视图的应用程序,您可以双击某个项目以进入详细视图。
一切正常,我目前正在通过发送 ChangePage 消息进行前向导航,SHellView 获取该消息并为新页面发出 ActivateItem 命令。
我不太明白的是如何导航回页面并保持您离开页面时的状态?我读过有关 Conductor 系列的资料,但不太确定它在实践中是如何工作的?
是否有人举了一个例子,他们使用 eventAggregator 发送 ChangePage 消息并由 ShellView 处理,首先检查该页面是否已经存在,如果不存在则创建一个新页面?
谢谢!
更新:
我的更改页面消息如下所示:
public class ChangePageMessage
{
public readonly Type _viewModelType;
public ChangePageMessage(Type viewModelType)
{
_viewModelType = viewModelType;
}
}
而我在 ShellView 中对消息的处理是:
public void Handle(ChangePageMessage message)
{
if (message._viewModelType == typeof(SearchResultsViewModel))
{
ActivateItem(new SearchResultsViewModel(_eventAggregator));
}
else if(message._viewModelType == typeof(DetailedDocumentViewModel))
{
ActivateItem(new DetailedDocumentViewModel(_eventAggregator));
}
else
{
//here
}
}
例如,您可以将访问过的视图模型存储在 ShellViewModel
的列表或字典中,并在收到 message._viewModelType
类型的实例时简单地检查此集合中是否已经存在=13=] 事件。
如果它存在,你return那个实例。如果没有,那么您创建一个新实例,将其添加到列表或字典中,然后 return 这个。像这样:
private readonly Dictionary<Type, Screen> _viewModels = new Dictionary<Type, Screen>();
public void Handle(ChangePageMessage message)
{
if (_viewModels.TryGetValue(message._viewModelType), out Screen viewModel))
{
ActivateItem(viewModel);
}
else if (message._viewModelType == typeof(SearchResultsViewModel))
{
var vm = new SearchResultsViewModel(_eventAggregator);
_viewModels.Add(message._viewModelType, vm);
ActivateItem(vm);
}
else if (message._viewModelType == typeof(DetailedDocumentViewModel))
...
}
我是 Caliburn Micro 框架的新手,正在开发一个具有列表视图的应用程序,您可以双击某个项目以进入详细视图。
一切正常,我目前正在通过发送 ChangePage 消息进行前向导航,SHellView 获取该消息并为新页面发出 ActivateItem 命令。
我不太明白的是如何导航回页面并保持您离开页面时的状态?我读过有关 Conductor 系列的资料,但不太确定它在实践中是如何工作的?
是否有人举了一个例子,他们使用 eventAggregator 发送 ChangePage 消息并由 ShellView 处理,首先检查该页面是否已经存在,如果不存在则创建一个新页面?
谢谢!
更新:
我的更改页面消息如下所示:
public class ChangePageMessage
{
public readonly Type _viewModelType;
public ChangePageMessage(Type viewModelType)
{
_viewModelType = viewModelType;
}
}
而我在 ShellView 中对消息的处理是:
public void Handle(ChangePageMessage message)
{
if (message._viewModelType == typeof(SearchResultsViewModel))
{
ActivateItem(new SearchResultsViewModel(_eventAggregator));
}
else if(message._viewModelType == typeof(DetailedDocumentViewModel))
{
ActivateItem(new DetailedDocumentViewModel(_eventAggregator));
}
else
{
//here
}
}
例如,您可以将访问过的视图模型存储在 ShellViewModel
的列表或字典中,并在收到 message._viewModelType
类型的实例时简单地检查此集合中是否已经存在=13=] 事件。
如果它存在,你return那个实例。如果没有,那么您创建一个新实例,将其添加到列表或字典中,然后 return 这个。像这样:
private readonly Dictionary<Type, Screen> _viewModels = new Dictionary<Type, Screen>();
public void Handle(ChangePageMessage message)
{
if (_viewModels.TryGetValue(message._viewModelType), out Screen viewModel))
{
ActivateItem(viewModel);
}
else if (message._viewModelType == typeof(SearchResultsViewModel))
{
var vm = new SearchResultsViewModel(_eventAggregator);
_viewModels.Add(message._viewModelType, vm);
ActivateItem(vm);
}
else if (message._viewModelType == typeof(DetailedDocumentViewModel))
...
}