Caliburn.Micro框架學習筆記——Action的參數傳遞機制

據此篇文章,我們繼續來談談Caliburn.Mirco的Action參數傳遞機制。因此程序結構都是默認MVVM的形式。

基本機制

它的機制是——

Caliburn.Micro 的智能對象參數綁定機制通過約定和反射使得視圖和視圖模型之間的交互變得更加直觀和簡潔。通過 cal:Message.Attach 語法(附加屬性的方法,其中cal是我們引入caliburn.mirco的命名空間的別名),你可以在 XAML 中定義事件處理,并且 Caliburn.Micro 會自動將參數傳遞給視圖模型中的方法。

?那具體內部怎么實現的,我們這里不深究,而是去看怎么使用這個機制。但是其基本機制如下,個人總結,僅供參考。

  1. 命名約定:Caliburn.Micro 使用命名約定來匹配 XAML 中的事件處理和視圖模型中的方法。

  2. 參數自動綁定:當事件被觸發時,Caliburn.Micro 可以自動將事件參數傳遞給對應的視圖模型方法。例如,按鈕的 Click 事件可以將 RoutedEventArgs 傳遞給視圖模型方法。

  3. Action 語法:使用 cal:Message.Attach 語法來明確指定事件和對應的視圖模型方法。

?也就是說當我們想要觸發事件并傳入相應的參數時,在程序結構滿足MVVM的情況下,我們有如下幾種方法——

基本使用方法和步驟

在享受caliburn.micro給我們帶來的便利之前,先來看看如果不使用它的機制的話,我們一般是怎么做的。

需要手動綁定控件的事件到代碼后置文件中的事件處理程序,然后通過事件的形式的話,在后臺cs代碼中進行相應的邏輯書寫。假設在視圖層有以下代碼

<Grid><Button Name="MyButton" Content="Click Me" Width="100" Height="50" Click="MyButton_Click"/>
</Grid>

?在這里,這個button綁定了一個click事件,其事件名稱為MyButton_Click。然后后臺代碼為——

private void MyButton_Click(object sender, RoutedEventArgs e)
{MessageBox.Show("Button clicked!");
}

那如果是使用MVVM的架構的話,這里一般是使用命令的形式來進行事件觸發。因此視圖層需要修改為,1,引入ViewModel,2,增加命令

<Window.DataContext><local:MainViewModel />
</Window.DataContext>
<Grid><Button Content="Click Me" Width="100" Height="50" Command="{Binding MyCommand}"/>
</Grid>

?然后相對應的ViewModel代碼為

 public class MainViewModel{public ICommand MyCommand { get; }//命令public MainViewModel(){MyCommand = new RelayCommand(ExecuteMyCommand);//利用RelayCommand進行命令綁定}private void ExecuteMyCommand(object parameter)//命令的要執行的邏輯{MessageBox.Show("Button clicked!");}}public class RelayCommand : ICommand//這個命令繼承自ICommand,并實現{private readonly Action<object> _execute;private readonly Func<object, bool> _canExecute;public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null){_execute = execute;_canExecute = canExecute;}public event EventHandler CanExecuteChanged{add => CommandManager.RequerySuggested += value;remove => CommandManager.RequerySuggested -= value;}public bool CanExecute(object parameter)//命令執行判斷{return _canExecute == null || _canExecute(parameter);}public void Execute(object parameter)//帶參數傳遞到命令要去執行{_execute(parameter);}}

?天啊,感覺看到以上內容,感覺頭大。于是當引入caliburn.Micro后,我們看看效果。

但是使用之前來了解其約定和機制:

  1. 控件命名約定

    • 在視圖中,控件命名應該遵循一定的約定。例如,一個按鈕的名稱可以包含事件名稱和方法名稱的組合。
  2. 視圖模型方法命名

    • 在視圖模型中,方法的命名應該與控件的名稱相對應。

其基本機制是

  1. 命名約定:Caliburn.Micro 使用命名約定來匹配 XAML 中的事件處理和視圖模型中的方法。例如,按鈕的 Click 事件可以自動映射到視圖模型中的 ButtonName_Click 方法。

  2. 參數自動綁定:當事件被觸發時,Caliburn.Micro 可以自動將事件參數傳遞給對應的視圖模型方法。例如,按鈕的 Click 事件可以將 RoutedEventArgs 傳遞給視圖模型方法。

  3. Action 語法:使用 cal:Message.Attach 語法來明確指定事件和對應的視圖模型方法。

?它的原理是——

Caliburn.Micro 使用反射和約定來綁定視圖中的控件事件和視圖模型中的方法。以下是這個過程的基本原理:

  1. 查找控件

    • Caliburn.Micro 在視圖中查找所有控件,并讀取它們的 Name 屬性。
  2. 解析事件和方法

    • 根據控件的 Name 屬性,Caliburn.Micro 解析出控件類型(如 Button)和事件名稱(如 Click)。
  3. 查找方法

    • 在視圖模型中查找與事件名稱對應的方法。在這個示例中,Caliburn.Micro 查找一個名為 ButtonClick 的方法。
  4. 綁定事件

    • 使用反射將控件的事件(如按鈕的 Click 事件)綁定到視圖模型中的方法。
  5. 觸發方法

    • 當控件的事件被觸發時,Caliburn.Micro 調用視圖模型中的相應方法。

?所以當引入了這個類庫之后,我們有如下方便的操作。

1)直接寫一個空間Name讓它自動去mvvm中匹配對應的方法名

在視圖層

<Button Content="Button" Name="ButtonTest"/>

在MVVM中

  public void ButtonTest(){Value++;//視圖中的某個參數}

那么他會去匹配到ButtonTest這個方法。我們斷點調試就可以看到它直接到這里。是不是很爽。

傳參機制

2)當我們想要傳入參數時,可以怎么做?它具備怎樣的規則?

參數匹配規則

  1. 事件參數:如果方法有一個參數,Caliburn.Micro 會嘗試將事件參數(如 RoutedEventArgs)傳遞給方法。
  2. 屬性名匹配:如果方法有多個參數,Caliburn.Micro 會嘗試通過反射來匹配方法參數的名稱和類型。
  3. 默認值和類型匹配:如果找不到確切匹配的參數,框架會嘗試使用默認值或進行類型轉換,以滿足方法簽名。

一)使用Caliburn.micro的ActionMessage

 <Button Content="測試"><i:Interaction.Triggers><!--使用的是xmlns:i="http://schemas.microsoft.com/xaml/behaviors"中關于行為觸發的機制,需要觸發的是Click事件--><i:EventTrigger EventName="Click"><cm:ActionMessage MethodName="EventAction"><!--告知這個click事件一旦點擊就會觸發,且對應的是ViewModel中的方法EventAction--><cm:Parameter Value="1"/><!--這里就是告知這個事件觸發之后會傳入的參數--><cm:Parameter Value="2"/><cm:Parameter Value="3"/></cm:ActionMessage></i:EventTrigger></i:Interaction.Triggers></Button>

那么在ViewModel中,我們可以有對應的EventAction方法

  public void EventAction(int aa, int bb, int cc){}

當點擊這個按鈕時,斷點調試會跳到這里,那我們可以根據需要進行邏輯的書寫。

同理,當我們的參數沒寫時,是否會自動匹配?

 <TextBox Text="12" Name="aaa"/><Button Content="智能對象參數綁定-命令" Name="AAAAction"/>

?此時,當有一個方法名字為AAAAction,它的參數會傳入aaa,且此時它的傳入參數命名也為aaa。

二)使用智能語法匹配

使用的是附加屬性的邏輯。

  <Button Content="基本智能語法-命令"cm:Message.Attach="[Event Click] = [Action EventAction(1,2,tb.Text)]"/>

?其中

  1. cm:Message.Attach是 Caliburn.Micro 提供的附加屬性,用于將視圖中的事件綁定到視圖模型中的方法。

    • [Event Click] 指定了按鈕的 Click 事件。
    • [Action ButtonClick(1,2,tb.Text)] 指定了視圖模型中的 ButtonClick 方法,并傳遞 Click 事件的參數。

此時可以看到,我們可以很好滴直接傳入view中的某個控件的屬性作為參數。但是當我們不明確指出它的參數的時候,是否可以?這就有另外一個機制,就是占位符。

三)使用占位符的形式傳參

我總結如下

  1. $eventArgs:這是一個占位符,表示事件參數。Caliburn.Micro 會自動將 Click 事件的 RoutedEventArgs 傳遞給 ButtonClick 方法。

  2. $dataContext:這是一個特殊的占位符,表示按鈕所在的上下文(DataContext)。在 MVVM 模式中,DataContext 通常是綁定到視圖的視圖模型。[Event Click] = [Action EventAction($dataContext)]:這段語法表示當按鈕的 Click 事件觸發時,調用視圖模型中的 EventAction 方法,并將 DataContext 作為參數傳遞給該方法。在這個示例中,當你點擊按鈕時,EventAction 方法會被調用,并且 dataContext 參數會被傳遞給它。在 EventAction 方法中,dataContext 參數就是視圖模型的實例本身(MainViewModel
  3. $view:在這里,$view 占位符表示觸發事件的視圖元素本身。在這個例子中,視圖元素是按鈕。
  4. $this:在這里,$this 占位符表示當前視圖的實例本身。在視圖模型中,參數類型應該與視圖類型匹配,以便接收視圖的實例

其使用分別為——

  <Button Content="$eventArgs參數-命令"cm:Message.Attach="[Event Click] = [Action EventAction($eventArgs)]"/><Button Content="$dataContext參數-命令"cm:Message.Attach="[Event Click] = [Action EventAction($dataContext)]"/><Button Content="$view參數-命令"cm:Message.Attach="[Event Click] = [Action EventAction($view)]"/><Button Content="$this參數-命令"cm:Message.Attach="[Event Click] = [Action EventAction($this)]"/>

?然后我們ViewModel層的方法有

 public void EventAction(object arg){}

此時我們可以斷點到這個方法,然后去看這個arg,我們就可以很清楚的知道,當前它傳入的參數是什么。可以很清楚的知道參數類型。

這幾個方法的使用心得——》

  • $dataContext:用于將數據上下文(通常是視圖模型實例)作為參數傳遞給方法。
  • $eventArgs:用于將事件參數作為參數傳遞給方法。
  • $view:用于將觸發事件的視圖元素本身作為參數傳遞給方法。

選擇使用 $dataContext$eventArgs$view 取決于你需要在事件處理方法中處理的數據。如果你需要訪問視圖模型實例,使用 $dataContext;如果你需要處理事件參數,使用 $eventArgs;如果你需要訪問觸發事件的視圖元素,使用 $view

使用 $this

  • 可以將當前視圖的實例傳遞給視圖模型方法。
  • 方便在視圖模型中直接訪問當前視圖的屬性和方法。
  • 適用于需要在視圖模型中直接操作視圖的情況。

但需要注意,使用 $this 會引入視圖模型對視圖的直接依賴,可能會破壞 MVVM 架構的一些原則,因此應該謹慎使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19507.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C語言】探索文件讀寫函數的全貌

&#x1f308;個人主頁&#xff1a;是店小二呀 &#x1f308;C語言筆記專欄&#xff1a;C語言筆記 &#x1f308;C筆記專欄&#xff1a; C筆記 &#x1f308;喜歡的詩句:無人扶我青云志 我自踏雪至山巔 &#x1f525;引言 本章將介紹文件讀取函數的相關知識和展示使用場景&am…

vue中如何進行Markdown文檔展示與解析

vue中如何進行Markdown文檔展示與解析 一、安裝插件二、如何使用 需求&#xff1a;接口返回了一個政策詳情頁面&#xff0c;里面有圖片&#xff0c;用v-html展示的是url&#xff0c;所以改用vue-markdown 一、安裝插件 npm install vue-markdown --save二、如何使用 <vue-…

RabbitMQ 如何保證消息不丟失

開啟消息確認機制&#xff1a; 在發布消息時&#xff0c;可以設置deliveryMode為2&#xff08;持久化&#xff09;&#xff0c;以確保消息不會因為RabbitMQ的崩潰而丟失。 使隊列持久化&#xff1a; 通過設置durable為true&#xff0c;可以確保隊列在RabbitMQ重啟后依然存在。…

Python 實戰:打造智能進銷存系統

想象一下&#xff0c;在繁忙的商店里&#xff0c;每天都有數以百計的商品進進出出&#xff0c;庫存在不斷變化&#xff0c;銷售數據涌入&#xff0c;而你卻能輕松應對一切。是的&#xff0c;Python 可以幫你實現這一切。本文將教你如何使用 Python 構建一個智能的進銷存系統&am…

學習記錄-5.30

學習記錄-5.30 同步在我的博客可以來看看 http://www.zhihuigou.top/ ### Golang為什么比別的語言跟擅長并發: 首先是因為Goroutine&#xff0c;算是go的一個最大的特色 是輕量級的線程,創建一個goroutine的開銷非常小,大約幾KB,且調度開銷很低 并且goroutine的調度,并不…

React組件通信——兄弟組件

兄弟組件通信 方法一&#xff1a;狀態提升 子組件先將數據傳遞到父組件&#xff0c;父組件再把數據傳到另一個子組件中。 import { useState } from "react"; // 定義A組件&#xff0c;向B組件發送數據 function A({ onGetMsg }) {const name "this is A na…

fyne apptab布局

fyne apptab布局 AppTabs 容器允許用戶在不同的內容面板之間切換。標簽要么只是文本&#xff0c;要么是文本和一個圖標。建議不要混合一些有圖標的標簽和一些沒有圖標的標簽。 package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/container"//&…

PolarDB分布式架構學習筆記

PolarDB分布式是什么&#xff1f; 業務場景有哪些&#xff1f; 分布式焦點問題&#xff1f; 技術架構 CN DN介紹 CDC組件介紹 Columnar組件介紹 視頻學習&#xff1a;PolarDB 實操課 第一講&#xff1a;PolarDB分布式版架構介紹_嗶哩嗶哩_bilibili

都在說的跨網文件共享系統是什么?企業該怎么甄選?

跨網文件共享系統成為越來越受關注的產品焦點&#xff0c;那么跨網文件共享系統是什么呢&#xff1f;跨網文件共享是指在不同網絡之間共享文件的過程&#xff0c;使得不同網絡中的用戶可以訪問和使用共享的文件。 原則上而言&#xff0c;不同網絡間的文件是無法共享的&#xff…

在SpringBoot中使用redis中的zset實現延遲任務

為什么使用zset實現延遲任務 ZSET&#xff08;有序集合&#xff09;適合實現延遲任務的原因主要有以下幾點&#xff1a; 排序特性&#xff1a;ZSET根據分數&#xff08;score&#xff09;自動排序&#xff0c;這使得我們可以將任務的執行時間作為分數&#xff0c;從而能夠輕松…

OAK相機如何將 YOLOv9 模型轉換成 blob 格式?

編輯&#xff1a;OAK中國 首發&#xff1a;oakchina.cn 喜歡的話&#xff0c;請多多&#x1f44d;??? 內容可能會不定期更新&#xff0c;官網內容都是最新的&#xff0c;請查看首發地址鏈接。 Hello&#xff0c;大家好&#xff0c;這里是OAK中國&#xff0c;我是Ashely。 專…

最新消息:騰訊大模型App“騰訊元寶“上線了

&#x1f9d9;?♂? 諸位好&#xff0c;吾乃斜杠君&#xff0c;編程界之翹楚&#xff0c;代碼之大師。算法如流水&#xff0c;邏輯如棋局。 &#x1f4dc; 吾之筆記&#xff0c;內含諸般技術之秘訣。吾欲以此筆記&#xff0c;傳授編程之道&#xff0c;助汝解技術難題。 &#…

Python代碼:二十八、密碼游戲

1、題目 牛牛和牛妹一起玩密碼游戲&#xff0c;牛牛作為發送方會發送一個4位數的整數給牛妹&#xff0c;牛妹接收后將對密碼進行破解。 破解方案如下&#xff1a;每位數字都要加上3再除以9的余數代替該位數字&#xff0c;然后將第1位和第3位數字交換&#xff0c;第2位和第4位…

2024年藝術鑒賞與科學教育國際會議(ICAASE 2024)

2024年藝術鑒賞與科學教育國際會議 2024 International Conference on Art Appreciation and Science Education 【1】會議簡介 2024年藝術鑒賞與科學教育國際會議是一場集藝術、科學和教育于一體的國際性學術盛會。本次會議旨在推動藝術鑒賞與科學教育領域的深入交流與合作&am…

C語言(字符函數和字符串函數)1

Hi~&#xff01;這里是奮斗的小羊&#xff0c;很榮幸各位能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;關注收藏&#xff0c;歡迎歡迎~~ &#x1f4a5;個人主頁&#xff1a;小羊在奮斗 &#x1f4a5;所屬專欄&#xff1a;C語言 本系列文章為個人學習筆記&#x…

python API自動化(接口測試基礎與原理)

1.接口測試概念及應用 什么是接口 接口是前后端溝通的橋梁&#xff0c;是數據傳輸的通道&#xff0c;包括外部接口、內部接口,內部接口又包括&#xff1a;上層服務與下層服務接口&#xff0c;同級接口 外部接口&#xff1a;比如你要從 別的網站 或 服務器 上獲取 資源或信息 &a…

SpringMVC框架學習筆記(四):模型數據 以及 視圖和視圖解析器

1 模型數據處理-數據放入 request 說明&#xff1a;開發中, 控制器/處理器中獲取的數據如何放入 request 域&#xff0c;然后在前端(VUE/JSP/...)取出顯 示 1.1 方式 1: 通過 HttpServletRequest 放入 request 域 &#xff08;1&#xff09;前端發送請求 <h1>添加主人…

使用dockerfile快速構建一個帶ssh的docker鏡像

不多說先給代碼 FROM ubuntu:22.04 # 基礎鏡像 可替換為其他鏡像 USER root RUN echo root:root |chpasswd RUN apt-get update -y \&& apt-get install -y git wget curl RUN apt-get install -y openssh-server vim && apt clean \&& rm -rf /tmp/…

在SpringBoot項目中實現切面執行鏈功能

1.定義切面執行鏈頂級接口 AspectHandler /*** 切面執行鏈**/ public interface AspectHandler {/*** 設置排除項* param excludes*/default void setExcludes(List<String> excludes) {}/*** 獲取排除項* return*/default List<String> getExcludes() {return ne…

事務與并發控制

事務&#xff08;Transaction0&#xff09;&#xff1a;要么全做&#xff0c;要么全不做&#xff1b; 事務ACID&#xff1a;原子性Atomicity&#xff1b;一致性Consistency&#xff1b;隔離性Isolation&#xff1b;持久性Durability&#xff1b; 并發操作問題&#xff1a; 1.…