- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Telerik RadRibbonView在我的 WPF 4.5 项目中。设置如下所示。
在我的 Shell 中,我有一个 RibbonView 和一个 TabControl,定义为称为“RibbonRegion”和“TabRegion”的区域。 RibbonRegion 基本上是应用程序的菜单,TabRegion 包含主要内容。
我还创建了一个模块,其 View 包含一个 RibbonTab 和一个 RibbonButton。此按钮被设置为设置 RibbonContextTabView 和 TabItemView 的 DataContext 并将它们注册到各自区域的命令。 ContextTab 和 TabItem 共享同一个 ViewModel。此 ViewModel 具有 ContextTab 和 TabItem 绑定(bind)到的属性“IsSelected”。
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);
}
第一次执行上述命令时,设置 View 的 DataContext,然后将它们注册到区域中。这还将“IsSelected”属性设置为 true。如果我将焦点更改为 RibbonTab,我的 ContextTab 和 TabItem 将失去焦点并且“IsSelected”属性设置为 false。如果我再次按下按钮 RequestNavigate被执行并再次将属性设置为 true。这是我的问题。如果我第三次这样做,什么都不会发生! RequestNavigate 已执行,但该属性未设置为 true,并且 Views 未重新获得焦点。我对 PRISM 还很陌生,恐怕我离这里还很远。任何帮助将不胜感激。
最佳答案
为了以松散耦合的方式保持 ViewModels 之间的通信,您可以简单地使用 EventAggregator 并从 Command Button 引发一个事件> 实现,然后由 TabItemViewModel 处理。
您提到的将一个 ViewModel 添加到另一个中的解决方案并不理想,因为这些组件最终会以紧密耦合的方式工作,并将错误的情况定义为 Views/ViewModels不会依赖于另一个 View 。
因此,要完成 EventAgregation 方法,您需要从 View/ViewModel 上的容器抛出构造函数接收 EventAggregator,其中按钮被单击,并且在每个 ViewModels 上您都希望订阅 到该事件设置 IsSelected EventHandler 方法中的属性。
您可以订阅“GiveFocusEvent”事件并在 ViewModels 上处理它,这将设置它们的 IsSelected 属性如下图:
public TabItemViewModel(IEventAggregator eventAggregator, ..){
...
GiveFocusEvent setFocusEvent = eventAggregator.Get<GiveFocusEvent>();
setFocusEvent.Subscribe(SetFocusEventHandler, ThreadOption.UIThread);
}
public void SetFocusEventHandler(){
// change IsSelected property value..
}
Event 将从 Button 的 CommandHandler 方法内部发布,如下所示:
this.eventAggregator.GetEvent<GiveFocusEvent>().Publish();
请注意,您需要创建并使您的“GiveFocusEvent”事件类继承自 CompositePresentationEvent:
public class GiveFocusEvent : CompositePresentationEvent<string>{}
希望对你有帮助
问候。
关于c# - Prism RequestNavigate 和 ViewModel OnPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20215003/
在每个 View 中 public partial class View2 : UserControl, IRegionMemberLifetime, INavigationAware { pub
我正在构建一个演示应用程序来学习 Prism 4 的导航功能。该应用程序有两个模块——每个模块有三个 View : 带有文本 block (“欢迎来到模块 A”)的用户控件 一个 RibbonTab(
我对 Prism 还很陌生,我目前正在使用 Prism 作为概念验证项目重写我们现有的应用程序之一。 该应用程序使用 MVVM 和 ViewModel 优先方法:我们的 ViewModel 由容器解析
我正在尝试学习 Prism Navigation 支持。目前,我有一个 Prism 区域,我想使用 RegionManager.RequestNavigate() 将 View 加载到该区域。导航确实
我正在使用 Prism view-based navigation使用 RequestNavigate 方法。 我遇到的问题是我必须向容器注册所有 ViewModel: container.Regis
在Prism 7中,我可以像这样从IModuleRegisterForNavigation和RequestNavigate: public class ModuleAModule : IModule
我正在使用 Telerik RadRibbonView在我的 WPF 4.5 项目中。设置如下所示。 在我的 Shell 中,我有一个 RibbonView 和一个 TabControl,定义为称为“
我将 prism5 与 regionManager 一起使用。以下是我如何注册我的观点以及我如何尝试导航。 _container.RegisterType("MyView"); 这就是我的导航方式 _
我使用一个区域和两个 View 。我有一个 ComboBox,让用户可以选择区域中的 View 。 我有两个问题: 第一个问题是: _regionManager.Regions.Add("MyRegi
我正在使用 prism 4.0,wpf, 我为 devx DocumentGroup 创建了 RegionAdapter。 我有一个显示为 DocumentPanel(DocumentGroup 的子
在 WPF 窗体上,我有一个超链接,当单击它时,应该会在重定向到内部网页之前聚合数据库中的一些数据。 目前 XAML 看起来如下: Launch Payments Portal 使用 Hype
我正在使用 Prism用于在我的 WPF MVVM 应用程序中导航。我的观点如下。 // MyView is the data type of the view I want to register
我是一名优秀的程序员,十分优秀!