在Prism 框架中,实现主程序与模块间 UI 的通信

背景:

在模块的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); }
        }

并在 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 属性也是一种不错的办法,后续可以再进行研究。

时间: 2024-10-11 01:49:27

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

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

Prism.Regions命名空间下有2个重要接口:IRegionManager.IRegion IRegionManager接口中的方法与属性:AddToRegion().RegisterViewWithRegion(),Regions属性 IRegion接口中的方法:Add与Remove(加载.剔除).Activate与Deactivate(出现.消失). 使用Activate与Deactivate前,Region中一定先有View对象. 方式1.RegisterViewWithRegion

requirejs定义的模块返回的永远是单例对象,可以借助javascript中的类解决模块间的相互干扰问题

RequireJS中定义一个模块,总的来说有2种方式:简单键值对和函数依赖式. 1.简单键值对:一个模块仅含有值对,没有任何依赖 define({ color: "black", size: 1, method1: function() {}, method2: function() {} }); 这种写法虽然简单,但是有很大的局限性,仅仅是定义了该模块的返回值,不能做一些额外的初始化工作. 通过下面下面这种方式来定义模块,灵活性更高,我们可以在函数体内写一些模块初始化的代码. def

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

说到AngularJS,我们首先想到的大概也就是双向数据绑定和指令系统了,这两者也是AngularJS中最为吸引人的地方.双向数据绑定呢,感觉没什么好说的,那么今天我们就来简单的讨论下AngularJS这个框架的指令系统. 指令作为AngularJS中最为重要的部分,所以这个框架本身也是自带了比较多的的指令,但是在开发中,这些指令通常不能满足我们的需要,所以我们也是需要自定义一些指令的.那么一个AngularJS指令在HTML代码中可以有四种表现形式: 1.作为一个新的HTML元素来使用. <h

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

Flask中上下文,分为请求上下文和应用上下文.既状态留存 ,就是把变量存在某一个地方可以调用 请求上下文:实际就是request和session用法理念,既都是可以存储东西. 应用上下文:既变量共享,就是把东西存储在变量里可以打印预览,应用上下文包括 current_app模块和g模块 cookie方法增,查,删. 注:存储cookie时使用set_coooki方法存储key--calve形式数据,另一个参数max_age 是指定的存活时间. 调用cookie的方法是通过request模块的c

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

上篇博文链接 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实现各个模块间的通信,在上一篇博文的基础上改的. 先上效果图:初步介绍下,图中虚线分割为四个模块,每个模块可向另外三个模块发消息.这里还是基于模块化开发CS端程序的思路,模块之间低耦合,如果项目做大,好处自然体现出来了. 图中的效果已经实现了一个模块朝其他三个模块发送消息.这里我使用的事Prism框架中的PubSubEvent事件,其优点是简单易用,直接Pub

WPF Step By Step 系列-Prism框架在项目中使用

WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Prism框架来构建基础的应用框架,并且如何来设计项目的架构和模块,下面我们就来一步步开始吧. 本文大纲 1.Prism框架下载和说明 2.Prism项目预览及简单介绍. 3.Prism框架如何在项目中使用. Prism框架下载和说明 Prism框架是针对WPF和Silverlight的MVVM框架,这

如何使用Prism框架的EventAggregator在模块间进行通信

目的 本文主要介绍如何使用Prism类库提供的事件机制在松耦合组件之间相互通信,Prism类库的事件机制建立在事件聚合服务之上,允许发布者和订阅者通过事件进行通信,不需要彼此之间引用. 事件聚合 EventAggregator提供了多点传送发布/订阅功能.这意味着可能有可以触发同一事件多个发布者和可以监听同一事件的订阅者. 使用方法 事件参数类 using Microsoft.Practices.Prism.Events; /// <summary> /// 定义事件,切换主题 /// <

Prism 框架解读之一系列

名词解释 1.什么是IOC IOC是 Inversion of Control的缩写,多数书籍翻译成“控制反转”. IOC 和依赖注入(DI) 所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中. 2. Bootstrapper: 在程序中使用框架需要找到一个切入点,将框架植入进去,将一部分功能委托给框架来实现.在Silverlight中使用Prism的切入点就是App.xaml.cs中的Application_Startup方法.一般来说,这个方法中只是指定页面最先加

Web API应用架构在Winform混合框架中的应用(1)

在<Web API应用架构设计分析(1)>和<Web API应用架构设计分析(2)>中对WebAPI的架构进行了一定的剖析,在当今移动优先的口号下,传统平台都纷纷开发了属于自己的Web API平台,方便各种终端系统的接入,很多企业的需求都是以Web API优先的理念来设计整个企业应用体系的.Web API作为整个纽带的核心,在整个核心层需要考虑到统一性.稳定性.以及安全性等方面因素.本文主要介绍,Web API应用架构,在Winform整合中的角色,以及如何实现在Winform混合