嗨,
我是Prism和WPF的新手,我有一个关于在视图之间共享数据的问题。
我正在开发的应用程序类似于SQL Server Development Studio。演示包含两个区域。第一个区域包含树(如SQL Server DS中的Object explorer)。树节点绑定到不同的视图模型。示例将是DatabaseA-> Tables-> dbo.TableA->列等。
第二个区域最初是空的。当我双击树节点时,我想打开显示我在树中单击的数据的视图
详细说明:
1.双击树节点
2.节点数据并将其显示在第二区域中
3.如果第二个区域不为空,请检查点击的节点数据是否已显示在现有标签页中
4.如果没有,请创建包含已点击节点数据的新标签页,否则请关注现有标签页
到现在为止,我设法创建了树。单击应用程序调用树节点时:
UriQuery uriQuery = new UriQuery {{"ID", unit.Id.ToString()}};
uriQuery.Add("TypeName", "Unit");
var uri = new Uri("DebugTreeItemView" + uriQuery, UriKind.Relative);
RegionManager.RequestNavigate("SECOND_REGION", uri);
这将打开带有制表符控件的视图,我可以获取uri参数。但我对这个解决方案不满意。我需要一种方法:
1.拦截此RegionManager.RequestNavigate调用以检查是否已创建选项卡控件。此外,我需要检查单击节点数据是否尚未显示在现有标签页之一中
2.我想将Unit对象直接发送到选项卡控件视图,而不是发送ID和typename。实现这一目标的最佳方法是什么?
感谢。
答案 0 :(得分:0)
我会ShellViewModel
控制我的整体申请。它将包含左侧的TreeNode
集合和右侧的OpenTabs
集合。它还包含右侧的SelectedTabIndex
,如果有意义的话,也可能包含左侧的SelectedTreeNode
。
如果要打开新标签页,我会使用EventAggregator
发布OpenTab
事件并将其传递给所选的TreeNode项。 ShellViewModel
将订阅这些事件,并确定该对象是否已存在于OpenTabs
集合中。如果存在,则只设置SelectedTabIndex
。如果没有,则会在设置OpenTabs
SelectedTabIndex
集合中
前段时间我在MVVM上发布了here这样的导航内容,如果你有兴趣的话