【WPF】Prism学习(十)

Prism MVVM

在这里插入图片描述

1.BindableBase

1.1. BindableBase的作用

  • Prism库提供了一个基础类BindableBase,这个类实现了INotifyPropertyChanged接口。这个接口允许ViewModel(视图模型)通知视图(View)当属性(Property)发生变化时,以便视图可以更新显示。

1.2. Prism的接口驱动特性

  • Prism框架的许多功能,如响应生命周期事件、导航等,都是基于接口的。这意味着Prism并不强制要求开发者使用特定的基础类。

1.3. BindableBase的可选性

  • 尽管Prism提供了BindableBase作为INotifyPropertyChanged的实现,以帮助开发者,但它并不强制要求开发者必须使用这个类。开发者可以根据自己的需要选择任何基础类,甚至不使用任何基础类(尽管通常不推荐这样做)。

2.创建属性

在继承自BindableBase的类中创建属性,并确保这些属性的变化能够通知到用户界面(UI)。具体来说,它介绍了如何使用SetProperty方法来设置属性值,并确保属性有一个公共的属性和一个私有的后端字段(backing field)。

2.1. 创建属性(Creating Properties)

  • 当你在继承自BindableBase的类中创建属性时,如果你希望这些属性的变化能够通知到UI,你应该使用SetProperty方法来设置这些变化。
  • 每个属性都应该有一个公共的属性接口(供外部访问和设置),以及一个私有的后端字段,用于实际存储属性值。

2.2. 示例代码

public class ViewAViewModel : BindableBase
{
    private string _message;
    public string Message
    {
        get => _message;
        set => SetProperty(ref _message, value);
    }
}
  • 代码示例展示了一个名为ViewAViewModel的类,它继承自BindableBase
  • 这个类中有一个名为_message的私有字符串字段,用于存储消息内容。
  • 同时,它有一个公共的字符串属性Message,用于获取和设置消息内容。
  • Message属性的set访问器中,使用了SetProperty方法来更新_message字段的值。SetProperty方法接受三个参数:一个引用传递的当前值(ref _message),新值(value),以及一个可选的回调委托,当属性值变化时执行。

2.3. SetProperty方法的作用

  • SetProperty方法不仅设置属性的新值,还自动比较新旧值,只有在值实际变化时才触发INotifyPropertyChanged事件,这样可以避免不必要的事件触发。
  • 如果直接设置值并调用RaisePropertyChanged,将失去这种内置的值比较功能,可能导致即使值未变化也触发事件。

3.为什么使用SetProperty

在实现MVVM模式时,使用SetProperty方法来设置属性值是更好的选择,而不是直接调用RaisePropertyChanged方法。

首先,提出了一个问题:“为什么使用SetProperty?毕竟你可以直接调用RaisePropertyChanged,不是吗?”然后,给出了简短的答案:虽然你可以这样做,但通常不推荐,因为你将失去内置的EqualityComparerEqualityComparer的作用是确保如果设置了多次相同的值,INotifyPropertyChanged接口只会在值第一次改变时触发PropertyChanged事件。

接下来,通过一个代码示例来说明直接调用RaisePropertyChanged的问题:

public class ViewAViewModel : BindableBase
{
    private string _message;
    public string Message
    {
        get => _message;
        set
        {
            // 不要这样做!
            _message = value;
            RaisePropertyChanged();
        }
    }
}

这种代码在生产环境中很常见,但这种代码是有根本缺陷的,过于冗长,并且会导致不必要的PropertyChanged事件被触发。因此,你应该始终围绕SetProperty方法来构建你的代码流程。

总结一下,使用SetProperty而不是直接调用RaisePropertyChanged的原因是:

  1. SetProperty内置了EqualityComparer,可以避免在属性值没有实际改变时触发PropertyChanged事件。
  2. 直接调用RaisePropertyChanged会导致代码过于冗长,并且可能会引发不必要的事件。
  3. 使用SetProperty可以使代码更加简洁,并且遵循MVVM的最佳实践。

4.在属性变化时执行委托

public abstract class ViewModelBase : BindableBase, IActiveAware
{
    private bool _isActive;
    public bool IsActive
    {
        get => _isActive;
        set => SetProperty(ref _isActive, value, () => {
            if (value)
                OnIsActive();
            else
                OnIsNotActive();
        });
    }

    protected virtual void OnIsActive() { }
    protected virtual void OnIsNotActive() { }
}

4.1. 代码示例

  • ViewModelBase 类继承自 BindableBase 类并实现了 IActiveAware 接口。
  • BindableBase 类是一个基类,它实现了 INotifyPropertyChanged 接口,允许对象通知绑定的UI元素属性值的变化。
  • IActiveAware 接口用于管理视图模型的激活状态。

4.2. IsActive 属性

  • IsActive 属性是一个布尔值,表示视图模型是否处于激活状态。
  • IsActive 属性的 set 访问器中,使用了 SetProperty 方法来更新 _isActive 私有字段的值,并注册了一个回调函数。
  • SetProperty 方法接受三个参数:一个引用传递的当前值、新值和一个可选的回调函数。

4.3. 回调函数

  • IsActive 属性的值被设置时,SetProperty 方法会检查新值和旧值是否相等。如果不相等,它会触发 PropertyChanged 事件,并执行提供的回调函数。
  • 在这个例子中,回调函数是一个匿名函数,它检查 IsActive 的新值:
    • 如果新值为 true,则调用 OnIsActive 方法。
    • 如果新值为 false,则调用 OnIsNotActive 方法。

4.4. OnIsActive 和 OnIsNotActive 方法

  • 这两个方法是用来响应激活状态变化的虚拟保护方法。你可以在派生类中重写这些方法来执行特定的逻辑。

相关链接

  • 介绍(Introduction)
  • 命令(Commands)
    • 命令(Commanding)
    • 复合命令(Composite Commands)
    • 异步命令(Async Commands)
    • 错误处理(Error Handling)
  • 依赖注入(Dependency Injection)
    • 依赖注入(Dependency Injection)
    • 注册类型(Registering Types)
    • 处理解析错误
    • ContainerLocator
  • MVVM
    • BindableBase

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络学习笔记-3.3以太网和局域网

以太网 以太网(Ethernet)是一种用于计算机网络的技术规范,广泛应用于局域网(LAN)的构建。它定义了如何在网络设备之间传输数据,并确保这些数据能够被可靠传送。以太网是目前最常见和最广泛使用的局域网技术…

聊一聊Elasticsearch的索引分片的恢复机制

1、什么是索引分片的恢复? 所谓索引分片的恢复指的是在某些条件下,索引分片丢失,ES会把某索引的分片复制一份来得到该分片副本的过程。 2、触发分片恢复的场景有哪些? 分片的分配 当集群中节点的数量发生变化,或者配…

LLaMA-Factory 上手即用教程

LLaMA-Factory 是一个高效的大型语言模型微调工具,支持多种模型和训练方法,包括预训练、监督微调、强化学习等,同时提供量化技术和实验监控,旨在提高训练速度和模型性能。 官方开源地址:https://github.com/hiyouga/L…

NVR接入录像回放平台EasyCVR视频融合平台加油站监控应用场景与实际功能

在现代社会中,加油站作为重要的能源供应点,面临着安全监管与风险管理的双重挑战。为应对这些问题,安防监控平台EasyCVR推出了一套全面的加油站监控方案。该方案结合了智能分析网关V4的先进识别技术和EasyCVR视频监控平台的强大监控功能&#…

信息与网络安全

1.对称密码体制的优缺点 优点:1.加密解密处理速度快 2.保密度高; 缺点:1.对称密码算法的密钥 分发过程复杂,所花代价高 2.多人通信时密钥组合的数量会出现爆炸性膨胀(所需密钥量大) 3.通信双方必须统一密钥…

NAT网络地址转换——Easy IP

NAT网络地址转换 Tip: EasylP没有地址池的概念,使用接口地址作为NAT转换的公有地址。EasylP适用于不具备固定公网IP地址的场景:如通过DHCP, PPPOE拨号获取地址的私有网络出口,可以直接使用获取到的动态地址进行转换。 本次实验模拟nat协议配置 AR1配置如下&…

【Three.js基础学习】27.Modified materials

前言 补充:\node_modules\three\src\renderers\shaders 自Three.js第132版以来,位于ShaderLib/文件夹中的着色器现在按材质分组。 顶点代码和片段代码都在同一个文件中。 课程 学习如何改进3DS内置材质 改进网格标准材质 两种方法 1.使用Three.js钩子&am…

使用 AI 在医疗影像分析中的应用探索

文章目录 摘要引言医疗影像分析中的 AI 应用场景AI 技术在医疗影像中的核心算法成功案例解析实现医疗影像分类的关键技术点代码示例及解析1. 数据加载与预处理2. 模型定义3. 模型训练4. 主函数完整代码 QA 环节总结参考资料 摘要 医疗影像分析是 AI 在医疗领域的重要应用方向&…

全面认识AI Agent,一文读懂AI智能体的架构指南

文章目录: AI Agent概述 AI Agent的架构 AI Agent与相关技术的比较 AI Agent框架和平台 总结与未来展望 AI Agent概述 1.1 定义AI Agent AI Agent,或称为人工智能代理,我更愿意称为AI智能体。它是一种模拟人类智能行为的人工智能系统…

【提效工具开发】管理Python脚本执行系统实现页面展示

Python脚本执行:工具管理Python脚本执行系统 背景 在现代的软件开发和测试过程中,自动化工具和脚本的管理变得至关重要。为了更高效地管理工具、关联文件、提取执行参数并支持动态执行Python代码,我们设计并实现了一套基于Django框架的工具…

基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)

#1024程序员节|征文# 博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…

典型的 SOME/IP 多绑定用例总结

SOME/IP 部署中 AP SWC 不自行打开套接字连接的原因 在典型的 SOME/IP 网络协议部署场景里,AP SWC 不太可能自己打开套接字连接与远程服务通信,因为 SOME/IP 被设计为尽可能少用端口。这一需求源于低功耗 / 低资源的嵌入式 ECU,并行管理大量…

Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系

参考spring-cloud-alibaba github wiki说明:版本说明 下面截取说明: 2022.x 分支 2021.x 分支 2.2.x 分支 组件版本关系

STM32完全学习——系统时钟设置

一、时钟框图的解读 首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟,由于内部HSI存在较大的误差,因此我们在系统完成上电初始化,之后需要将STM32的时钟切换到外部HSE作为系统时钟,那么我…

ubuntu无密码用SCP复制文件到windows

默认情况下,ubuntu使用scp复制文件到windows需要输入密码: scp *.bin dev001@172.16.251.147:~/Desktop/. 为了解决每次复制文件都要输入密码这个问题,需要按如下操作: 1.创建ssh密钥 ssh-keygen -t ed25519 -C "xxx_xxx_xxx@hotmail.com" 2.使用scp复制公钥到w…

vulfocus在线靶场:CVE-2018-7600 速通手册

目录 一、启动环境,访问页面,语言选择中文,打开phpmyadmin 二、phpmyadmin中打开小房子 三、选择显示php信息 四、ctrlF,搜索flag,复制粘贴到任务中,通关 一、启动环境,访问页面,…

vue3 element el-table实现表格动态增加/删除/编辑表格行,带有校验规则

需求描述 在项目中遇到需要实现表格动态的新增、编辑、删除表格行的需求,同时带有校验规则 代码解决 点击新增的时候,给新增row默认属性,给相应的默认值,包括给一个isEditor: true,用来区分是否需要编辑。同时当有编…

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具 文章目录 python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具项目背景技术栈用户界面核心功能实现结果展示完整代码总结 在现代软件开发中,测试接口的有效性与响应情况变得尤为重要。本文将指导…

MySQL社区版的启动与连接

1.启动: 注意:MySQL是默认开机自启的 方式一: 1.WinR 的命令行中直接输入services.msc 2.在服务中找到数据库名称,然后鼠标右键点击启动 方式二: 1.在开始选项中搜索“cmd”命令提示符,使用管理员身份运行 …

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情,将它与表白结合在一起,会创造出别具一格的惊喜效果。使用Python的turtle模块,我们可以轻松绘制出动态的烟花特效,再配合文字表白,打造一段专属的浪漫体验。 接下来,让…