C# WPF - MVVM实现OPC Client管理系统
前言
本文主要讲解采用WPF MVVM模式设计OPC Client的过程,算作对于WPF MVVM架构的学习记录吧!不足之处请不吝赐教,感谢!
涉及知识点
- C#基础
- Xaml基础
- 命令、通知和数据绑定
- Prism+Blend
- MahApps.Metro(第三方框架)
- OPC
项目实现功能
- 用户登陆(模拟登陆过程,未连接数据库)
- OPC同步读写、异步读写操作等
开发环境
- Window 10
- Visual Studio 2019
- .Net Framework 4.8
成品效果图

项目详解
MVVM框架搭建
为了节省开发时间,在事件绑定上使用了Prism框架,OPC通信方面使用了OPCDAAuto.dll类库,二者均可以通过Nuget方式安装到项目中。
- 定义了一个DelegateCommand类用来处理属性和命令;
- 定义了一个NotificationObject类用来通知属性和命令的改变;
注意:在使用事件绑定时,需要添加引用 xmlns:i="http://schemas.microsoft.com/xaml/behaviors",然后根据控件对应事件的名称设置绑定命令即可。
比如我们想给ComboBox的SelectionChanged事件设置一个事件绑定,可这么写
xaml代码:

<ComboBox
x:Name="CombServerList"
Width="120"
Margin="{StaticResource ControlMargin}"
ItemsSource="{Binding ServerList}">
<!-- 事件绑定 -->
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=CombServerList}" />
</i:EventTrigger>
</i:Interaction.Triggers> </ComboBox>
VM代码:

public ICommand SelectionChangedCommand
{
get
{
return new Prism.Commands.DelegateCommand<ComboBox>((combobox) =>
{
// 业务逻辑
});
}
}
相关类的定义代码如下:

public class DelegateCommand : ICommand
{
public event EventHandler CanExecuteChanged; /// <summary>
/// 判断判断命令是否可以被执行
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public bool CanExecute(object parameter)
{
if (this.CanExecuteFunc != null)
{
this.CanExecuteFunc(parameter);
}
else
{
return true;
}
return false;
} /// <summary>
/// 执行相关的函数或者命令
/// </summary>
/// <param name="parameter"></param>
public void Execute(object parameter)
{
if (this.ExecuteAction != null)
{
this.ExecuteAction(parameter);
}
else
{
return;
}
} /// <summary>
/// 声明一个委托用来执行命令对应的方法
/// </summary>
public Action<object> ExecuteAction { get; set; } /// <summary>
/// 声明一个方法,用来判断命令是否可以被执行
/// </summary>
public Func<object, bool> CanExecuteFunc { get; set; } }
DelegateCommand

public class NotificationObject : INotifyPropertyChanged
{
/// <summary>
/// 实现接口
/// </summary>
public event PropertyChangedEventHandler PropertyChanged; /// <summary>
/// 通知属性的改变
/// </summary>
/// <param name="propertyName"></param>
public void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
NotificationObject
UI界面搭建
这里主要采用第三方开源框架MahApps.Metro,可以通过NuGet方式安装到项目中,这里不再展开讲解,感兴趣的朋友可以参考 MahApps.Metro - Quick Start
OPC相关处理
大致分为如下几步:
- 获取OPC服务列表
- 连接OPC服务
- 创建分组
- 获取项目列表
- 添加项目到分组中
- 对项目的内容进行读写操作
比较简单,不再展开了。
登陆界面
这里我们说一说登陆界面的实现,由于追求PURE MVVM,所以这里有三点需要说明一下:
- PasswordBox绑定
- 圆形头像
- 登陆窗体切换
PasswordBox绑定:自定义帮助类,使用PasswordBoxBehavior实现绑定;
圆形头像:自定义样式,增加Image圆角属性;
登陆窗体切换:借助prism的shell。
至此,已全部结束。
作者:Jeremy.Wu
出处:https://www.cnblogs.com/jeremywucnblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
C# WPF - MVVM实现OPC Client管理系统的更多相关文章
- WPF MVVM 验证
WPF MVVM(Caliburn.Micro) 数据验证 书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model ...
- 关于OPC的研究1]c# opc client源码调试和学习笔记
c# opc client是一个在网上下载的示例程序,调试的时候还是费了一番周折,服务器端程序来自king view6.55,另文介绍. 1.注册dll 程序中有一个名叫OPCDAAuto.dll的文 ...
- WPF MVVM初体验
首先MVVM设计模式的结构, Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联: ViewModels:由一组命令,可以绑 ...
- WPF MVVM实现TreeView
今天有点时间,做个小例子WPF MVVM 实现TreeView 只是一个思路大家可以自由扩展 文章最后给出了源码下载地址 图1 图2 模版加上了一个checkbox,选中父类的checkb ...
- WPF/MVVM 快速开始指南(译)(转)
WPF/MVVM 快速开始指南(译) 本篇文章是Barry Lapthorn创作的,感觉写得很好,翻译一下,做个纪念.由于英文水平实在太烂,所以翻译有错或者译得不好的地方请多指正.另外由于原文是针对W ...
- A WPF/MVVM Countdown Timer
Introduction This article describes the construction of a countdown timer application written in C# ...
- 使用Prism提供的类实现WPF MVVM点餐Demo
使用Prism提供的类实现WPF MVVM点餐Demo 由于公司开发的技术需求,近期在学习MVVM模式开发WPF应用程序.进过一段时间的学习,感受到:学习MVVM模式,最好的方法就是用MVVM做几个D ...
- WPF MVVM使用prism4.1搭建
WPF MVVM使用prism4.1搭建 MVVM即Model-View-ViewModel,MVVM模式与MVP(Model-View-Presenter)模式相似,主要目的是分离视图(View)和 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 18.集成OPC Client,及使用步骤
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
随机推荐
- 树莓派3B安装ubuntu mate系统后无法联网
问题描述:在安装系统的初始化操作时,可以联网,如下图所示: 但是在系统安装结束后,wifi标志处无信号,无法搜索wifi信号. 解决方法:实测有效 直接打开终端(ctrl+alt+t),执行指令:su ...
- PAT 1036 Boys vs Girls (25分) 比大小而已
题目 This time you are asked to tell the difference between the lowest grade of all the male students ...
- Rocket - devices - TLDeadlock
https://mp.weixin.qq.com/s/Zv4HE7zMBzHbsWGg3pa9fg 简单介绍TLDeadlock的实现. 1. TLDeadlock TLDeadlock是抽象类Dev ...
- Rocket - diplomacy - NodeHandle相关类
https://mp.weixin.qq.com/s/GWL41P1G1BXm2sTeLmckdA 介绍NodeHandle相关的类. 1. NoHandle 顶层类(tra ...
- 使用RTL进行硬件模型编程的局限性
https://mp.weixin.qq.com/s/Nj_d3hwgNX4kWVtKsqMSWg 硬件模型编程,即Hardware Model Programming.在RTL抽象级别 ...
- Java实现 LeetCode 295 数据流的中位数
295. 数据流的中位数 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2. ...
- Java实现 蓝桥杯VIP 算法提高 分数统计
算法提高 分数统计 时间限制:1.0s 内存限制:512.0MB 问题描述 2016.4.5已更新此题,此前的程序需要重新提交. 问题描述 给定一个百分制成绩T,将其划分为如下五个等级之一: 9010 ...
- Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...
- java实现排座位
** 排座位** 要安排:3个A国人,3个B国人,3个C国人坐成一排. 要求不能使连续的3个人是同一个国籍. 求所有不同方案的总数? 参考答案: 283824 public class Main1 { ...
- java实现第六届蓝桥杯循环节长度
循环节长度 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位. 下面的方法,可以 ...