背景:

在模块的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. 蓝桥杯_算法训练_Torry的困惑(基本型)

    这个题目就是求质数的乘积,在加一个模,思路比较简单,直接上代码: #include<iostream> using namespace std; bool isPrime(int a) { ...

  2. attention 介绍

    前言 这里学习的注意力模型是我在研究image caption过程中的出来的经验总结,其实这个注意力模型理解起来并不难,但是国内的博文写的都很不详细或说很不明确,我在看了 attention-mech ...

  3. ASP.NET Core MVC 源码学习:详解 Action 的匹配

    前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...

  4. 64位平台C/C++容易犯的错误

     64位平台的介绍 IA-64 is a 64-bit microprocessor architecture developed by Intel and Hewlett Packard compa ...

  5. BaseDao优化

    BaseDao优化2种方法 1. try { //读取配置文件,配置文件保存了数据库的东西 String path=”database.properties”; //创建实例化对象 Propertie ...

  6. VIM -小技巧汇总

    一 代码自动对齐: 1 命令行模式下先输入gg 然后按=后输入大写的G,这样整个文件的代码就对齐了. 二 选中多行缩进 1.按v进入visual状态,选择多行,用>或<缩进或缩出 2. 通 ...

  7. Java垃圾回收(GC)机制详解

    一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此.所以,垃圾回收是必须的. 二. ...

  8. No principal was found in the response from the CAS server

    按网上的配置了 public String casServerUrlPrefix = "http://cas-server.com:8080/cas"; public String ...

  9. 不得不提的volatile及指令重排序(happen-before)

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  10. Apache-Flink深度解析-State

    摘要: 实际问题 在流计算场景中,数据会源源不断的流入Apache Flink系统,每条数据进入Apache Flink系统都会触发计算.如果我们想进行一个Count聚合计算,那么每次触发计算是将历史 ...