我有一个跟随MVVM模式的现有WPF应用程序和Caliburn-Micro框架。我有一个新的要求,即向UI添加交互式面包屑。虽然我可以毫无问题地渲染面包屑,但是当我被用户点击其中一个面包屑时,我很难确定如何处理激活。
我有一个n级对象图,其中每个对象都是一个指挥< T> .Collection.OneActive。
UI可以通过调用ActivateItem来处理基本的“导航”,并激活每个导体的项目。在每个级别,我显示项目列表,当单击一个项目时,它将被激活。只要激活的项目具有子项目,UI就会显示其子项目列表。单击其中一个时,该子项将被激活,等等。
我可以通过将活动根项目中的此对象图形爬行到活动子项目来构建面包屑跟踪等等但是我不知道在点击面包屑时如何重新激活项目因为我有对项目的引用,而不是包含/管理该项目的指挥。
有什么想法吗?
答案 0 :(得分:0)
只是有一个可能有用的想法。听起来导体是分层的,所以:
使用事件聚合器触发包含要激活的视图模型的属性的简单消息类型
public class BreadcrumbNavigate
{
public IScreen Screen { get; private set; }
public BreadcrumbNavigate(IScreen screen) { Screen = screen; }
}
导体都应该倾听这些类型的消息;当他们收到消息时,如果他们当前处于活动状态,他们应该只响应它,这意味着只有痕迹路径的叶节点才会响应第一条消息。
如果消息中的VM不是指挥的子节点,指挥应该自行关闭并重新发布聚合器消息,以便下一个有效指挥可以处理它(不知道这将有多好,因为它依赖于一个指挥关闭自己,然后宣传一条消息,但就像我说的,这只是一个想法)。
最终,树上某处的正确导体将处理该消息,并且该导体将具有与该消息匹配的子VM - 这是导航目标,并且消息传播停止的位置
修改强>
由于导体在有活动的孩子时处于活动状态,因此上述操作不起作用 - 所以要废弃!
您可以发布有关您的设置的更多信息吗?
就你所描述的而言,它听起来像一个简单的面包屑导航场景;为了沿着痕迹路径返回,您只需要在要跳回的VM的活动项目上使用TryClose()
:
// on the VM that you want to navigate to...
public void NavigateToMe()
{
// Check if we have a child, if so try and close it...will close all children etc
if (ActiveItem != null)
{
ActiveItem.TryClose();
}
}
显然,您可以将其包装在辅助方法中,例如
public void NavigateTo(IConductActiveItem vm)
{
var iClose = vm.ActiveItem as IClose;
if(iClose != null)
{
iClose.TryClose();
}
}
因此,在痕迹中你需要的只是对VM的引用,在检查它有一个可关闭的孩子并且调用TryClose()
所有子VM /导体应该在所选孩子的下方关闭 - 显然这只会在VM的子项始终是项目指挥
这假设您只是使用以下对象图:
指挥 - >导体 - >导体 - >导体