天天看點

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代碼:

C# WPF - MVVM實作OPC Client管理系統
C# WPF - MVVM實作OPC Client管理系統
<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>      

View Code

VM代碼:

C# WPF - MVVM實作OPC Client管理系統
C# WPF - MVVM實作OPC Client管理系統
public ICommand SelectionChangedCommand             {                 get                 {                     return new Prism.Commands.DelegateCommand<ComboBox>((combobox) =>                     {                        // 業務邏輯                     });                 }             }      

相關類的定義代碼如下:

C# WPF - MVVM實作OPC Client管理系統
C# WPF - MVVM實作OPC Client管理系統
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

C# WPF - MVVM實作OPC Client管理系統
C# WPF - MVVM實作OPC Client管理系統
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/

  本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。