前言

本文主要讲解采用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管理系统的更多相关文章

  1. WPF MVVM 验证

    WPF MVVM(Caliburn.Micro) 数据验证 书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model ...

  2. 关于OPC的研究1]c# opc client源码调试和学习笔记

    c# opc client是一个在网上下载的示例程序,调试的时候还是费了一番周折,服务器端程序来自king view6.55,另文介绍. 1.注册dll 程序中有一个名叫OPCDAAuto.dll的文 ...

  3. WPF MVVM初体验

    首先MVVM设计模式的结构, Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联: ViewModels:由一组命令,可以绑 ...

  4. WPF MVVM实现TreeView

    今天有点时间,做个小例子WPF MVVM 实现TreeView 只是一个思路大家可以自由扩展 文章最后给出了源码下载地址 图1   图2     模版加上了一个checkbox,选中父类的checkb ...

  5. WPF/MVVM 快速开始指南(译)(转)

    WPF/MVVM 快速开始指南(译) 本篇文章是Barry Lapthorn创作的,感觉写得很好,翻译一下,做个纪念.由于英文水平实在太烂,所以翻译有错或者译得不好的地方请多指正.另外由于原文是针对W ...

  6. A WPF/MVVM Countdown Timer

    Introduction This article describes the construction of a countdown timer application written in C# ...

  7. 使用Prism提供的类实现WPF MVVM点餐Demo

    使用Prism提供的类实现WPF MVVM点餐Demo 由于公司开发的技术需求,近期在学习MVVM模式开发WPF应用程序.进过一段时间的学习,感受到:学习MVVM模式,最好的方法就是用MVVM做几个D ...

  8. WPF MVVM使用prism4.1搭建

    WPF MVVM使用prism4.1搭建 MVVM即Model-View-ViewModel,MVVM模式与MVP(Model-View-Presenter)模式相似,主要目的是分离视图(View)和 ...

  9. 《连载 | 物联网框架ServerSuperIO教程》- 18.集成OPC Client,及使用步骤

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

随机推荐

  1. 【C++】常见易犯错误之数值类型取值溢出与截断(3)

    0.  前言 本节是“[C++]常见易犯错误之数值类型取值溢出与截断(1)” 的补充,主要探讨浮点型的取值溢出. 1. 相关知识 (1) 浮点型数据取值范围如下: 单精度型 float 3.4 * 1 ...

  2. json工具--org.json.jar

    org.json可以解析json.把对象包装成json.API文档:http://resources.arcgis.com/en/help/arcobjects-java/api/arcobjects ...

  3. 浅谈SIEM

    一.概念 SIEM ( Security Information Event Management,安全信息与事件管理) Gartner的定义:安全信息和事件管理(SIEM)技术通过对来自各种事件和上 ...

  4. GNS3内网通过cloud与实际网络实现互连互通的实验(使用环回网口)

    一.背景: 在GNS3内构建一个测试网络,该测试网络的设备能够通过cloud访问外部网络设备和Internet网,外部网络也能直接访问GNS3内网的设备. 考虑通过cloud上的环回口连接GNS3内网 ...

  5. 关于替换“c2a0”十六进制字符的方法

    一.背景:在爬取网络小说生成的文件中,发现有些空格没法替换,使用十六进制编辑器查看,发现这些空格字符的十六进制值是“c2a0”,其来源是网页控制的特殊字符,这是一个叫做Non-breaking spa ...

  6. oeong.xyz

    兴趣使然而搭的小破站:oeong.xyz

  7. Java实现 LeetCode 719 找出第 k 小的距离对(二分搜索法+二分猜数字)

    719. 找出第 k 小的距离对 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入: nums = [1,3, ...

  8. Java实现蓝桥杯历届试题兰顿蚂蚁

    历届试题 兰顿蚂蚁 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其 ...

  9. Java实现 LeetCode 501 二叉搜索树中的众数

    501. 二叉搜索树中的众数 给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素). 假定 BST 有如下定义: 结点左子树中所含结点的值小于等于当前结点的值 结点 ...

  10. Java实现 蓝桥杯 算法训练 Multithreading

    问题描述 现有如下一个算法: repeat ni times yi := y y := yi+1 end repeat 令n[1]为你需要算加法的第一个数字,n[2]为第二个,-n[N]为第N个数字( ...