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

摘要:
publicboolShowCheckbox{get{returnthis.showCheckBox;value);UserControl.Resources>StackPanelOrientation=“Horizontal”HorizontalAlignment=“Stretch”>

背景:

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

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

需求:

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

问题:

    解决该问题的一个难处在于,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 的通信》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇08 package分析oracle创建表空间 扩展表空间文件 修改表空间自动增长下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring-SpringMVC父子容器&amp;amp;AOP使用总结

此文已由作者尧飘然授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 Spring&SpringMVC Spring&SpringMVC作为bean管理容器和MVC默认框架,是大多数web应用都会选择的方案。在其使用过程中,尽管基于xml的配置bean管理的方式依然存在,但在很多情况下已经采用的强大的注解功能将其替代。...

VUE三 vue-router(路由)详解

前端路由 根据不同的 url 地址展示不同的内容或页面,无需依赖服务器根据不同URL进行页面展示操作 优点 用户体验好,不需要每次都从服务器全部获取,快速展现给用户 缺点 使用浏览器的前进,后退键的时候会重新发送请求,没有合理地利用缓存 单页面无法记住之前滚动的位置,无法在前进,后退的时候记住滚动的位置 一、路由(以user为例) userList--...

Quartz 设置一个半小时任务实现

该文章属于本人原创,转载请注明出处。   spring + Quartz 设置定时任务时要求没一个半小时执行一次   设置两个相同的定时任务   第一个从整点开始每三小时执行一次              <!--每三小时执行一次任务,从整点开始-->        <propertyname="cronExpression"valu...

git管理子模块

目录 git管理子模块 submodule 常用命令 创建带子模块的项目 克隆带子模块的项目 项目中修改子模块 项目中获取子模块 项目中删除子模块 subtree 常用命令 创建带子模块的项目 克隆带子模块的项目 项目中修改子模块 项目中获取子模块 项目中删除子模块 文件软链接 git管理子模块 当项目越来越庞大之后,不可避免的要...

WMI简介和Event驻留

  WMI (Windows Management Instrumentation,Windows管理规范) 从Windows 2000开始被包含于操作系统后,就一直是Windows操作系统的一部分。这项技术对于系统管理员来说具有巨大价值,因为它提供了提取所有类型信息、配置组件和基于系统数个组件的状态采取行动等方式。由于这种灵活性,且被早早地被包含于操作系...

WPF实现无刷新动态切换多语言(国际化)

1. 在WPF中国际化使用的是 .xaml文件的格式       如图:Resource Dictionary (WPF)        2. 创建默认的语言文件和其他语言文件        这里以英语为默认语言,新建一个 Resource Dictionary (WPF)文件,并命名为DefaultLanguage.xaml,内容如下:    <R...