【发布时间】:2013-11-26 10:51:20
【问题描述】:
我在我的 WPF 4.5 项目中使用Telerik RadRibbonView。设置如下所示。
在我的 Shell 中,我有一个 RibbonView 和一个 TabControl,它们被定义为称为“RibbonRegion”和“TabRegion”的区域。 RibbonRegion 基本上是应用程序的菜单,而 TabRegion 保存主要内容。
我还创建了一个带有视图的模块,其中包含一个 RibbonTab 和一个 RibbonButton。此按钮连接到一个命令,该命令设置 RibbonContextTabView 和 TabItemView 的 DataContext 并将它们注册到各自的区域中。 ContextTab 和 TabItem 共享同一个 ViewModel。此 ViewModel 有一个属性“IsSelected”,ContextTab 和 TabItem 都绑定到该属性。
if (_regionManager.Regions["RibbonRegion"].Views.Any(v => v.GetType() == typeof(ContextTabView)) && _regionManager.Regions["TabRegion"].Views.Any(v => v.GetType == typeof(TabItemView)))
{
_regionManager.RequestNavigate("RibbonRegion", new Uri("ContextTabView", UriKind.Relative));
_regionManager.RequestNavigate("TabRegion", new Uri("TabItemView", UriKind.Relative));
}
else
{
ContextTabView contextTabView = _container.Resolve<ContextTabView>();
TabItemView tabItemView = _container.Resolve<TabItemView>();
contextTabView.DataContext = tabItemView.DataContext = new ContextTabTabItemViewModel();
_regionManager.RegisterViewWithRegion("RibbonRegion", () => contextTabView);
_regionManager.RegisterViewWithRegion("TabRegion", () => tabItemView);
}
第一次执行上述命令时,会设置视图的 DataContext,然后将它们注册到区域中。这也将“IsSelected”属性设置为 true。如果我将焦点更改为 RibbonTab,我的 ContextTab 和 TabItem 将失去焦点,并且“IsSelected”属性设置为 false。如果我再次按下按钮,RequestNavigate 将被执行,并且该属性再次设置为 true。这是我的问题。如果我第三次这样做,什么都不会发生! RequestNavigate 已执行,但该属性未设置为 true,并且 Views 不会重新获得焦点。我对 PRISM 还很陌生,恐怕我离这里很远。任何帮助将不胜感激。
【问题讨论】:
-
根据我的理解,每次按下按钮时,都会为已经处于活动状态的视图调用 RequestNavigate,这是正确的吗?通过活动,我的意思是视图正在区域中显示。您是否在 ViewModel 构造函数中将 IsSelected 属性设置为“true”?您似乎对 Navigation 行为感到困惑。您想将焦点设置在指定控件上,还是想在每个 Region 内的 Views 之间切换?问候。
-
是的,我想你是对的。 Views 已经处于活动状态,只是没有聚焦。我确实想再次将属性 IsSelected 设置为 true。但是如何从另一个 ViewModel 访问 ViewModel 中的 IsSelected?我应该使用Prism EventAggregator吗?
-
我想我明白了。我在 Module
_container.RegisterType<IViewModelB, ViewModelB>();中注册了 ViewModel。然后我通过 ViewModelApublic ViewModelA(IViewModelB viewModelB) { _viewModelB = viewModelB; }的构造函数注入它,现在我可以在执行命令时访问 IsSelected 属性。 -
最后一种方法不是最好的松散耦合通信。 EventAggregator 仅使用弱引用帮助保持 ViewModels 解耦。我现在回复你。
标签: c# wpf mvvm telerik prism-4