背景:

在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图

需求:

在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显示复选框,一个不显示。

问题:

解决该问题的一个难处在于,Prism框架本身的设计原则——此 View 会被添加到主程序的 Shell 的 Region 中,所以在主程序中不能直接来控制该 View 的属性及其逻辑。

思路:

利用 EventAggregator 使得主程序与模块间进行通信,从而间接地达到我们的目的。

实现:

首先,在模块的 View 所对应的 ViewModel 中添加一个属性 ShowCheckbox,如下:

        public bool ShowCheckbox
{
get { return this.showCheckBox; }
set { this.SetProperty(ref this.showCheckBox, value); }
}

其中的 SetProperty 方法是在 BindableBase 类(由 Prism.MVVM 库提供)的方法,其介绍可点击这里,这样写的好处:1. 省去自己再实现 INotifyPropertyChanged 接口;2. 避免可能在类似 RaisePropertyChanged("XXX") 语句中写错属性的名字。只要当我们的 ViewModel 类继承了 BindableBase 类,就可以这样来定义那些值被更改后需要通知UI的属性。

并在 View 中为其添加绑定,如下 CheckBox 的 Visibility 属性的绑定:

    <UserControl.Resources>
<HierarchicalDataTemplate x:Key="HierarchicalView" ItemsSource="{Binding SubCategories}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
<CheckBox IsChecked="{Binding IsChecked}" Margin="6,6,5,0" Visibility="{Binding ShowCheckbox,ElementName=treeViewControl,Converter={StaticResource BoolToVisibilityConverter}}" />
<TextBlock Text="{Binding Name}" FontSize="20" />
<StackPanel.ToolTip>
<TextBlock VerticalAlignment="Center" Text="{Binding Name}" TextWrapping="Wrap" MaxWidth="200" />
</StackPanel.ToolTip>
</StackPanel>
</HierarchicalDataTemplate>
</UserControl.Resources>

然后,我们需要在底层库 Infrastructure 中定义一个事件,主程序与模块就是通过该事件来进行通信,以达到修改模块中 UI 的值,代码如下:

    public class ControlVisibleEvent : PubSubEvent<bool>
{
}

接下来,就是对该事件进行订阅与发布,自然地,我们在模块中来订阅上述事件,代码如下:

this.EventAggregator.GetEvent<DemoBase.ControlVisibleEvent>().Subscribe((value) =>
{
this.ShowCheckbox = value;
});

在订阅事件时,我们获取值并把获取到的值传给  ViewModel 的 ShowCheckbox 属性,再通过WPF的通知机制以达到UI的变化。

在主程序中,我们发布该事件,发布时,需要考虑的问题是在何时发布,这里我们选择在加载模块完成的事件中进行发布,代码如下(注意其中的高亮代码):

        public MainWindow(IEventAggregator eventAggregator, IModuleManager moduleManager)
{
InitializeComponent();
this.EventAggregator = eventAggregator;
this.ModuleManager.LoadModuleCompleted += ModuleManager_LoadModuleCompleted;
} void ModuleManager_LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e) {
this.EventAggregator.GetEvent<DemoBase.ControlVisibleEvent>().Publish(false);
}

这时,在不同的应用程序中,只要修改在发布事件时的值,即可达到模块中UI的改变。

备注:

实现此需求的不止上述方法,此外,利用 Region 对象的 RegionContext 属性也是一种不错的办法,后续可以再进行研究。

在Prism 框架中,实现主程序与模块间 UI 的通信的更多相关文章

  1. Prism框架中加载类库中时其中第三方类dll提示无法加载程序集

    Prism框架是采用一种依赖注入的方式动态加载程序集,能够在程序需要加载的时候将程序集注入到里面去,实现程序的热插拔效果,而且采用这种框架能够让我们进行一个大项目的独立开发,在最近的一个项目中在独立开 ...

  2. Prism框架 如何在主程序中合理的弹出子窗体

    说起子窗体,大家都会想到ChildWindow,多熟悉的一个控件.不错,Sliverlight中已经提供了子窗体的具体实现,而在WPF中却没有这么好的事情(有的第三方控件商已经提供此控件).最常见的实 ...

  3. Prism框架中View与Region关联的几种方式

    Prism.Regions命名空间下有2个重要接口:IRegionManager.IRegion IRegionManager接口中的方法与属性:AddToRegion().RegisterViewW ...

  4. 浅谈AngularJS中的指令和指令间的相互通信

    说到AngularJS,我们首先想到的大概也就是双向数据绑定和指令系统了,这两者也是AngularJS中最为吸引人的地方.双向数据绑定呢,感觉没什么好说的,那么今天我们就来简单的讨论下AngularJ ...

  5. Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块

    Flask中上下文,分为请求上下文和应用上下文.既状态留存 ,就是把变量存在某一个地方可以调用 请求上下文:实际就是request和session用法理念,既都是可以存储东西. 应用上下文:既变量共享 ...

  6. Prism for WPF再探(基于Prism事件的模块间通信)

    上篇博文链接 Prism for WPF初探(构建简单的模块化开发框架) 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实 ...

  7. Prism框架研究(一)

    从今天起开始写一个Prism框架的学习博客,今天是第一篇,所以从最基本的一些概念开始学习这个基于MVVM的框架的学习,首先看一下Prism代表什么,这里引用一下比较官方的英文解释来看一下:Prism ...

  8. mock 模拟数据在框架中的简单使用

    首先在框架中需要安装mock模块 cnpm i mockjs -S 其次在src文件夹下新建mock文件夹,在mock文件夹中新建一个index.js文件 代码如下: const Mock = req ...

  9. 【17MKH】我在框架中对.Net依赖注入的扩展

    说明 依赖注入(DI)是控制反转(IoC)的一种技术实现,它应该算是.Net中最核心,也是最基本的一个功能.但是官方只是实现了基本的功能和扩展方法,而我呢,在自己的框架 https://github. ...

随机推荐

  1. 恢复oracle数据从delete

    今天维护系统的时候没仔细看,误删了50行数据,然后想起来以前学过delete语句删除的数据是可以回复的,但是那个时候比较慌乱,也没有心情仔细看,反而是想到了一个歪招解决了问题,我有个良好的嗜好就是经常 ...

  2. apache与tomcat负载集群集成方法配置

    apache与tomcat负载集群集成方法有3种jk.jk_proxy.http_proxy apache:httpd-2.2.17-win32-x86-no_ssl.msi tomcat:apach ...

  3. 【腾讯Bugly干货分享】职场中脱颖而出的成长秘诀

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/uQKpVg7HMLfogGzzMyc9iQ 导语 时光 ...

  4. 背水一战 Windows 10 (118) - 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知)

    [源码下载] 背水一战 Windows 10 (118) - 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知) 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 ...

  5. [转]异常声音检测之kaldi DNN 训练

    转自:http://blog.csdn.net/huchad/article/details/52092796 使用kaldi的DNN做音频分类,异常声音检测. HMM/GMM -> HMM/D ...

  6. 吴恩达机器学习笔记23-神经网络:表述--非线性假设(Non-linear Hypotheses)

    我们之前学的,无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时,计算的负荷会非常大.下面是一个例子: 当我们使用

  7. 微信小程序实现显示和隐藏控件-头像-取值-bindblur事件

    微信小程序实现显示和隐藏控件 .wxml: <view class=" {{showOrHidden?'show':'hidden'}}"></view> ...

  8. ubuntu16.04 Docker默认存储路径修改

    Ubuntu 16.04 Docker默认存储路径修改

  9. (转)asyncio --- 异步 I/O

    原文:https://docs.python.org/zh-cn/3/library/asyncio.html asyncio 是用来编写 并发 代码的库,使用 async/await 语法. asy ...

  10. javaScript笔记详解(1)

    javaScript基础详解 版权声明 本文原创作者:雨点的名字 作者博客地址:https://home.cnblogs.com/u/qdhxhz/ 首先讲javaScript的摆放位置:<sc ...