gpt4 book ai didi

c# - Prism RequestNavigate 和 ViewModel OnPropertyChanged

转载 作者:太空宇宙 更新时间:2023-11-03 13:31:53 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com