WPF入门到跪下 第十一章 Prism(一)数据处理

官网:https://primslibrary.com
源码地址:https://guthub.com/PrismLibrary/prism
Prism是由微软发布、维护的开源框架,提供了一组设计模式的实现,有助于编写结构良好的且可维护的XAML应用程序,包括MVVM、依赖注入、命令、事件聚合器等。
关键程序集
Prism.Core:实现MVVM的核心功能,是一个与平台无关的项目,可以在多个开发平台中使用(Prism.dll)。

  • 如果只需要实现MVVM中的一些简单功能、例如属性变化通知、命令等,只需要在Nuget中安装Prism.Core库即可。在这里插入图片描述

Prism.Wpf:包含了DialogServiceRegionModuleNavigation和其他一些WPF功能,使得WPF开发更加方便快捷(Prism.Wpf.dll)。

  • 如果需要进一步使用WPF中的一些其他功能,可以在Nuget中安装Prism.Wpf库,由于Prism.Wpf依赖于Prism.Core因此,无需再安装Prism.Core

    在这里插入图片描述

Prism.Unity:包含Prism.Unity.Wpf.dllPrism.DryIoc.Wpf.dll

  • 如果需要使用IOC,则需要安装Prism.Unity,由于Prism.Unity依赖于Prism.Wpf,因此不需要再安装Prism.WpfPrism.Core

    在这里插入图片描述

数据处理

一、属性变化通知

Prism框架提供了BindableBase类,用于做数据处理(例如属性的变化通知等)。

五种属性变化通知方式

通过继承BindableBase类,可以更加便捷地在WPF中实现属性变化通知,具体有如下五种方式。
其中前三种没啥特殊的,第四种方式可以在属性变化时,通知其他属性的绑定控件;而第五种方式则可以在属性发生变化后调用指定的函数。

public class MainViewModel : BindableBase
{private string _value;public string Value{get { return _value; }set {// 第一种方式SetProperty(ref _value, value);// 第二种方式//this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Value"));// 第三种方式//this.RaisePropertyChanged();// 第四种方式:可以通知另一个属性//SetProperty(ref _value, value, "Var");// 第五种方式//SetProperty(ref _value, value, OnValueChanged);}}private void OnValueChanged(){//属性成功变化后的执行函数}
}

二、数据异常处理

Prism框架提供了ErrorsContainer<T>类型专门用于处理项目中出现地异常。其中泛型T为指定的异常消息类型。

1、INotifyDataErrorInfo接口

使用ErrorsContainer<T>需要实现INotifyDataErrorInfo接口。
实现INotifyDataErrorInfo接口主要需要实现其中的三个成员,分别如下:

event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged:事件属性成员,用于异常通知。

bool HasErrors:属性成员,用于判断是否存在异常。

  • 一般会通过ErrorsContainer对象的HasErrors属性来进行判断。

IEnumerable GetErrors(string propertyName):方法成员,用于获取相关属性名称的异常。

  • 一般会通过ErrorsContainer对象的GetErrors方法来获得对应属性的异常。
public class MainViewModel :INotifyDataErrorInfo
{//声明ErrorsContainer对象,这里没有定义,详细做法请看下文public ErrorsContainer<string> _errorsContainer;public bool HasErrors => _errorsContainer.HasErrors;public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;public IEnumerable GetErrors(string propertyName){return _errorsContainer.GetErrors(propertyName);}......
}

2、ErrorsContainer类

构造函数

ErrorsContainer<T>(Action<string> raiseErrorsChanged):创建ErrorsContainer对象。

  • raiseErrorsChanged:发生异常时的执行函数,函数中要去触发异常发生事件,也就是INotifyDataErrorInfo接口的ErrorsChanged事件成员。

常用成员

bool HasErrors:属性成员,用于判断当前是否存在异常。

IEnumerable<T> GetErrors(string propertyName):获取指定属性的异常集合。

  • propertyName:要获取异常的属性名称。

SetErrors(string propertyName, IEnumerable<T> newValidationResults):设置异常(也就是发生异常了)。

  • propertyName:触发异常的属性名称。
  • newValidationResults:异常集合,可以是string数组,也可以是其他类型数组。

3、具体实现过程

异常处理编写
实现INotifyDataErrorInfo接口

public class MainViewModel : INotifyDataErrorInfo
{public bool HasErrors => throw new NotImplementedException();public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;public IEnumerable GetErrors(string propertyName){throw new NotImplementedException();}
}

定义ErrorsContainer<T>对象属性,完善INotifyDataErrorInfo成员实现

public class MainViewModel : INotifyDataErrorInfo
{//定义异常属性private ErrorsContainer<string> _errorsContainer;public ErrorsContainer<string> ErrorsContainer{get {if (_errorsContainer == null){_errorsContainer = new ErrorsContainer<string>(OnErrorHappend);}return _errorsContainer; }}//当异常发生时,触发异常发生事件private void OnErrorHappend(string obj){ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(obj));}public bool HasErrors => ErrorsContainer.HasErrors;public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;public IEnumerable GetErrors(string propertyName){return ErrorsContainer.GetErrors(propertyName);}
}

继承BindableBase类,定义属性并实现属性变化通知,在特定条件下发生异常

public class MainViewModel : BindableBase,INotifyDataErrorInfo
{......//上文的内容private int _value;public int Value{get { return _value; }set {if (value > 10){ErrorsContainer.SetErrors("Value", new string[] { "数值不能大于10" });}SetProperty(ref _value, value); }}
}

异常消息展示

在xaml中进行异常消息的使用

<Window ......><Window.DataContext><local:MainViewModel/></Window.DataContext><Window.Resources><ControlTemplate TargetType="{x:Type TextBox}" x:Key="ct"><Grid><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition Height="auto"/></Grid.RowDefinitions><Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"CornerRadius="5"><ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"VerticalContentAlignment="Center" Margin="3,5" BorderThickness="0"/></Border><TextBlock Grid.Row="1" Text="{Binding (Validation.Errors)[0].ErrorContent,RelativeSource={RelativeSource AncestorType=TextBox,Mode=FindAncestor}}" Foreground="Red" Margin="10,5"Name="txtError"/></Grid><ControlTemplate.Triggers><Trigger Property="Validation.HasError" Value="True"><Setter Property="Visibility" Value="Visible" TargetName="txtError"/><Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Window.Resources><Grid><StackPanel><TextBlock Text="{Binding Value}"/><TextBox Text="{Binding Value,UpdateSourceTrigger=PropertyChanged}" Template="{StaticResource ct}"/></StackPanel></Grid>
</Window>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验三 Oracle数据库的创建和管理

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

HackTheBox - Medium - Linux - Health

Health Health 是一台中型 Linux 计算机&#xff0c;在主网页上存在 SSRF 漏洞&#xff0c;可利用该漏洞访问仅在 localhost 上可用的服务。更具体地说&#xff0c;Gogs 实例只能通过 localhost 访问&#xff0c;并且此特定版本容易受到 SQL 注入攻击。由于攻击者可以与 Gogs …

Redis基础知识(一)

一 Redis的数据类型 1.1 基本数据类型&#xff1a; String(字符串) Hash(哈希表) List(列表) Set(集合) ZSet(有序集合) 1.2 特殊类型 GEO(地理空间) HyperLogLog(基数统计) bitMap(位图) bitField(位域…

架构的演进

1.1单体架构 单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。 存在的问题&#xff1a; 代码耦合&#xff1a;模块的边界模糊、依赖关系不清晰&#xff0c;整个项目非常复杂&#xff0c;每次修改代码都心惊胆战迭代困…

RabbitMQ 部署与配置[CentOS7]

# RabbitMQ,Erlang 版本包对应 https://rabbitmq.com/which-erlang.html#eol-seriescd /usr/local/src# Erlang下载 # https://github.com/rabbitmq/erlang-rpm/releases https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.5/erlang-23.3.4.5-1.el7.x86_64.rp…

NTFS 磁盘管理器---NTFS Disk by Omi NTFS中文

NTFS Disk by Omi NTFS是一款专为Mac用户设计的NTFS磁盘管理工具。它可以帮助用户方便地访问和管理NTFS格式的硬盘、U盘、移动硬盘以及其他存储设备&#xff0c;并提供高效稳定的NTFS卷管理功能。该软件具有简单的用户界面&#xff0c;使用户能够快速访问和管理NTFS磁盘上的文件…

ChatGPT给出的前端面试考点(Vue.js)

ChatGPT给出的前端面试考点&#xff08;Vue.js&#xff09; 答案 1. Vue.js是什么&#xff1f;它的主要特点是什么&#xff1f; Vue.js是一个渐进式JavaScript框架&#xff0c;用于构建用户界面。它的主要特点包括&#xff1a; 数据绑定&#xff1a;Vue.js使用双向数据绑定&…

图灵日记之java奇妙历险记--String类

目录 String常用方法字符串构造String对象的比较字符串查找char charAt(int index)int indexOf(int ch)int indexOf(int ch, int fromIndex)int indexOf(String str)int indexOf(String str, int fromIndex)int lastIndexOf(String str)int lastIndexOf(String str, int fromIn…

OceanBase集群扩缩容

​ OceanBase 数据库采用 Shared-Nothing 架构&#xff0c;各个节点之间完全对等&#xff0c;每个节点都有自己的 SQL 引擎、存储引擎、事务引擎&#xff0c;天然支持多租户&#xff0c;租户间资源、数据隔离&#xff0c;集群运行的最小资源单元是Unit&#xff0c;每个租户在每…

OPC UA 开源库编译方法及通过OPC UA连接西门S7-1200 PLC通信并进行数据交换

前言 在现代工业自动化领域&#xff0c;OPC UA&#xff08;开放性生产控制和统一架构&#xff09;是一种广泛应用的通信协议。本文将以通俗易懂的方式解释OPC UA的含义和作用&#xff0c;帮助读者更好地理解这一概念。 一、OPC UA的定义 OPC UA全称为“开放性生产控制和统一…

Labview实现用户界面切换的几种方式---通过VI间相互调用

在做用户界面时我们的程序往往面对的对象是程序使用者&#xff0c;复杂程序如果放在同一个页面中&#xff0c;往往会导致程序冗长卡顿&#xff0c;此时通过多个VI之间的切换就可以实现多个界面之间的转换&#xff0c;也会显得程序更加的高大上。 本文所有程序均可下载&#xff…

【Python机器学习】多分类问题的不确定度

decision_function和predict_proba也适用于多分类问题。还是以鸢尾花数据集为例&#xff1a; from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets import make_circles,load_iris import numpy as np from sklearn.model_selection import train_…

【总结】Dinky学习笔记

概述 Dinky 是一个开箱即用、易扩展&#xff0c;以 Apache Flink 为基础&#xff0c;连接 OLAP 和数据湖等众多框架的一站式实时计算平台&#xff0c;致力于流批一体和湖仓一体的探索与实践 官网&#xff1a;Dinky 核心特性 沉浸式&#xff1a;提供专业的 DataStudio 功能&a…

1979-A threshold selection method from gray-level histograms

1 论文简介 《A threshold selection method from gray-level histograms》是由日本学者大津于 1979 年发表在 IEEE TRANSACTIONS ON SYSTEMS 上的一篇论文。该论文提出了一种基于图像灰度直方图的阈值化方法&#xff0c;计算简单&#xff0c;且不受图像亮度和对比度的影响&am…

64.Spring事件监听的核心机制是什么?

Spring事件监听的核心机制是什么? spring的事件监听有三个部分组成 事件(ApplicationEvent) 负责对应相应监听器 事件源发生某事件是特定事件监听器被触发的原因监听器(ApplicationListener) 对应于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应…

【论文阅读】ControlNet、文章作者 github 上的 discussions

文章目录 IntroductionMethodControlNetControlNet for Text-to-Image DiffusionTrainingInference Experiments消融实验定量分析 在作者 github 上的一些讨论消融实验更进一步的探索Precomputed ControlNet 加快模型推理迁移控制能力到其他 SD1.X 模型上其他 Introduction 提…

烟火检测/区域人流统计/AI智能分析网关V4如何配置通道?

TSINGSEE青犀智能分析网关&#xff08;V4版&#xff09;是一款高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;硬件内部署了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;并上报识别结果&#xff0c;并能进行语音…

【征服redis2】redis的事务介绍

目录 目录 1.redis事务介绍 2 事务出错的处理 3.Java如何使用redis事务 1.redis事务介绍 在前面我们介绍了redis的几种典型数据结构和应用&#xff0c;本文我们来看一下redis的事务问题。事务也是数据库的重要主题&#xff0c;熟悉关系型数据库的读者应该对事务比较了解&a…

erlang (OS 操作模块)学习笔记

cmd: env: 返回所有环境变量的列表。 每个环境变量都表示为元组 {VarName&#xff0c;Value}&#xff0c;其中 VarName 是 变量和 Value 其值。 例: {VarName&#xff0c;Value} {"ERLANG_HOME","C:\\Program Files\\erl-24.3.4.2\\bin\\erl-24.3.4.2"}…

2023我的总结:读书、写作、运动、爱家人、学一门手艺

不知不觉中&#xff0c;2024年1月已过去大半了&#xff0c;按照惯例&#xff0c;还是对过去一年的所思所行做个简单的汇报。也希望我的一些经历&#xff0c;能给到正在做年终总结或新年规划的朋友&#xff0c;一些参考。 01 读书&#xff0c;是门槛最低的高贵 最近一段时间&am…