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>

View Code

VM代碼:

        public ICommand SelectionChangedCommand
        {
            get
            {
                return new Prism.Commands.DelegateCommand<ComboBox>((combobox) =>
                {
                   // 業務邏輯
                });
            }
        }

View Code

相關類的定義代碼如下:

 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/
  本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

您可能也會喜歡…