WPF CommunityToolkit.Mvvm

文章目錄

  • 前言
  • Toolkit
    • Nuget安裝
    • 簡單使用
      • SetProperty,通知更新
      • RealyCommand
        • CanExecute
    • 新功能,代碼生成器
      • ObservableProperty
      • NotifyCanExecuteChangedFor
      • RelayCommand
        • 其他功能
        • 對應關系
      • NotifyPropertyChangedFor

前言

CommunityToolkit.Mvvm(以下簡稱Toolkit)是WPF最有名的兩個框架,一個是Prism,另一個就是Toolkit。

Prism可以看我的Prism詳解

WPF Prims框架詳解

Toolkit

Toolkit 官方文檔

用 CommunityToolkit.Mvvm 加速 MVVM 開發流程

Nuget安裝

在這里插入圖片描述

簡單使用

Toolkit簡單復寫了我們常用的兩個方法
一個是 SetProperty,一個是RelayCommand

SetProperty,通知更新

 public class MainViewModel:ObservableObject{private string _title;public string Title{get => _title;set => SetProperty(ref _title,value);}}

RealyCommand

public RelayCommand ButtonClickCommand { get; set; }public MainViewModel()
{ButtonClickCommand = new RelayCommand(() => { Debug.WriteLine("Hello World!"); });}

MVVM模式的3種command總結[2]–RelayCommand

RealyCommand主要有一個CanExecute屬性。通知是否能點擊

CanExecute

通知按鈕能否點擊(我感覺有點雞肋)

public class MainViewModel:ObservableObject
{private string _title = "Hello world!";public string Title{get => _title;set => SetProperty(ref _title,value);}private bool _isEnable = false;public bool IsEnable{get=> _isEnable;set{SetProperty(ref _isEnable,value);ButtonClickCommand.NotifyCanExecuteChanged();}}public RelayCommand ButtonClickCommand { get; set; }public MainViewModel(){ButtonClickCommand = new RelayCommand(() => { Title = "Value is changed"; },()=>IsEnable);}
}
<Window.DataContext><viewModel:MainViewModel />
</Window.DataContext>
<Grid><StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" ><TextBox Text="{Binding Title}" Width="200"/><CheckBox Content="Is Enable" IsChecked="{Binding IsEnable}" /><Separator Margin="5"/><Button Command="{Binding ButtonClickCommand}" Content="Click Me"/></StackPanel>
</Grid>

在這里插入圖片描述

新功能,代碼生成器

Toolkit新增了生成器功能,自動幫我們將代碼補全。

ObservableProperty

ObservableProperty
在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述
生成的Public屬性是符合一下特性

  • private
    • name=>Name
    • _name=>Name
    • m_name=>Name

以上三者都會自動對應到public Name

NotifyCanExecuteChangedFor

因為我們之前修改RelayCommand的CanExecute都是通過public 里面的get set去通知的,我們現在可以使用NotifyCanExecuteChangedFor來通知

[NotifyCanExecuteChangedFor(nameof(ButtonClickCommand))]
[ObservableProperty]
private bool _isEnable = false;
//等價于
private bool _isEnable = false;public bool IsEnable{get=> _isEnable;set{SetProperty(ref _isEnable,value);ButtonClickCommand.NotifyCanExecuteChanged();}}

RelayCommand

RelayCommand給一個Void函數,會自動生成一個對應Command 和初始化這個Command

[RelayCommand]
public void ButtonClick()
{}
//等價于
public RelayCommand ButtonClickCommand { get; set; }public MainViewModel()
{ButtonClickCommand = new RelayCommand(() => { Title = "Value is changed"; }, () => IsEnable);}

其他功能

//將CanExecute綁定到IsEnable
[RelayCommand(CanExecute =nameof(IsEnable))]
public void ButtonClick()
{}
///異步函數也可以,CanExecute會在異步函數結束之后變回去
[RelayCommand(CanExecute =nameof(IsEnable))]
public async Task ButtonClickAsync()
{await Task.Delay(1000);Title = "我被修改了";
}

異步函數演示:注意看按鈕顏色
在這里插入圖片描述

對應關系

ButtonClickAsync、ButtonClick=>ButtonClickCommand

NotifyPropertyChangedFor

我們希望兩個屬性是強關聯的,比如Title和TestStr是強關聯的。

我們希望能通知另一個屬性發生了更改,比如Title 通知TestStr更改

 private string testStr = $"Title:{Title}";

但是這么寫會報錯,只能設置靜態方法
在這里插入圖片描述
然后我們可以通過NotifyPropertyChangedFor來進行通知

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(TestStr))]
private string _title = "Hello world!";public string TestStr => $"Title:{Title}";

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

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

相關文章

自適應AI chatgpt智能聊天創作官網html源碼

我們致力于開發先進的自適應AI智能聊天技術&#xff0c;旨在為用戶提供前所未有的聊天體驗。通過融合自然語言處理、機器學習和深度學習等領域的頂尖技術&#xff0c;我們的智能聊天系統能夠準確理解用戶的需求并給出相應的回應。 我們的自適應AI智能聊天系統具備以下核心特點…

MySQL面試題二

1、關系型和非關系型數據庫的區別&#xff1f; 關系型數據庫的優點 容易理解&#xff0c;因為它采用了關系模型來組織數據。 可以保持數據的一致性。 數據更新的開銷比較小。 支持復雜查詢&#xff08;帶 where 子句的查詢&#xff09; 非關系型數據庫&#xff08;NOSQL&#x…

fiddler抓包問題記錄,支持https、解決 tunnel to 443

fiddler下載安裝步驟及基本配置 fiddler抓包教程&#xff0c;如何抓取HTTPS請求&#xff0c;詳細教程 可能遇到的問題及解決方案 1. 不能正常訪問頁面&#xff08;所有https都無法訪問&#xff09; 解決方案&#xff1a;查看下面配置是否正確 Rules-customization 找到 OnB…

Vue中路由緩存問題及解決方法

一.問題 Vue Router 允許你在你的應用中創建多個視圖&#xff0c;并根據路由來動態切換這些視圖。默認情況下&#xff0c;當你從一個路由切換到另一個路由時&#xff0c;Vue Router 會銷毀前一個路由的組件實例并創建新的組件實例。然而&#xff0c;有時候你可能希望保持一些頁…

【推薦】深入淺出學習Spring框架【中】

目錄 1.AOP是什么? 2.案列&#xff1a; 3.spring的aop的專業術語 4.代碼模擬 4.1 前置通知 3.2.后置通知 3.3.環繞通知 3.4.異常通知 3.5.過濾通知 1.AOP是什么? 面向切面編程&#xff08;Aspect-Oriented Programming&#xff09;是一種編程范式&#xff0c;它的主要…

第十四屆中國大學生服務外包大賽細品,上百支隊伍與合合信息用AI共克“記賬”難題

前言 熟悉我的小伙伴應該知道我在大學時期參與了很多競賽&#xff0c;我向來對比賽是比較熱枕的&#xff0c;以我個人觀點&#xff0c;我認為可以通過競賽激發學習激情和檢驗自己的技能水平掌握情況&#xff0c;大學生很少有機會能夠了解到課堂之外市場的需求&#xff0c;外包…

P1123 取數游戲

取數游戲 題目描述 一個 N M N\times M NM 的由非負整數構成的數字矩陣&#xff0c;你需要在其中取出若干個數字&#xff0c;使得取出的任意兩個數字不相鄰&#xff08;若一個數字在另外一個數字相鄰 8 8 8 個格子中的一個即認為這兩個數字相鄰&#xff09;&#xff0c;求…

JWT(JSON Web Token )令牌

1、介紹 jwt就是將原始的json數據格式進行了安全的封裝&#xff0c;這樣就可以直接基于jwt在通信雙方安全的進行信息傳輸了。 2、jwt組成 第一部分&#xff1a;Header(頭&#xff09;&#xff0c; 記錄令牌類型、簽名算法等。 例如&#xff1a;{"alg":"HS256…

EXCEL按列查找,最終返回該列所需查詢序列所對應的值,VLOOKUP函數

EXCEL按列查找&#xff0c;最終返回該列所需查詢序列所對應的值 示例&#xff1a;國標行業分類漢字&#xff0c;匹配id 使用VLOOKUP函數 第一參數&#xff1a;拿去查詢的值。 第二參數&#xff1a;匹配的數據。 Ps&#xff1a;Sheet1!$C 21 : 21: 21:E 117 &#xff0c;需要…

Redis系列(三):深入解讀Redis主從同步機制

首發博客地址 https://blog.zysicyj.top/ Redis高可靠靠什么保證&#xff1f; 為什么要提這個呢&#xff0c;因為Redis主從庫目的呢其實就是為了實現高可靠。上篇文章中我們說過Redis的AOF、RDB日志其實就是為了減少數據丟失&#xff0c;這是高可靠的一部分。 這篇文章呢&#…

Lua 位和字節

一、位運算 從 Lua 5.3 版本開始&#xff0c;提供了針對數值類型的一組標準位運算符&#xff0c;與算數運算符不同的是&#xff0c;運算符只能用于整型數。 運算符描述&按位與|按位或&#xff5e;按位異或>>邏輯右移<<邏輯左移&#xff5e;&#xff08;一元運…

Git 如何使用TortoiseGit 操作本地倉庫

初始化倉庫 方法一: 新建一個文件夾,進入文件夾內部操作 1、右鍵--> 在這里創建Git 版本庫 注意: 不要直接在桌面上操作,否則桌面就是一個倉庫 方法二: 1、右鍵-->Git GUI here 方法三: 命令行模式 1、 git init 創建完畢倉庫,我們發現,此時我們創建的文件夾下…

leetcode做題筆記83刪除排序鏈表中的重復元素

給定一個已排序的鏈表的頭 head &#xff0c; 刪除所有重復的元素&#xff0c;使每個元素只出現一次 。返回 已排序的鏈表 。 輸入&#xff1a;head [1,1,2] 輸出&#xff1a;[1,2] 思路一&#xff1a;模擬題意 struct ListNode* deleteDuplicates(struct ListNode* head){i…

FreeRTOS qemu mps2-an385 bsp 移植制作 :系統運行篇

相關文章 FreeRTOS qemu mps2-an385 bsp 移植制作 &#xff1a;環境搭建篇 FreeRTOS qemu mps2-an385 bsp 移植制作 &#xff1a;系統啟動篇 開發環境 Win10 64位 VS Code&#xff0c;ssh 遠程連接 ubuntu VMware Workstation Pro 16 Ubuntu 20.04 FreeRTOSv202212.01&a…

React 全棧體系(二)

第二章 React面向組件編程 一、基本理解和使用 1. 使用React開發者工具調試 2. 效果 2.1 函數式組件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_函數式組件</title> </head> &l…

計算機競賽 python 爬蟲與協同過濾的新聞推薦系統

1 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬蟲與協同過濾的新聞推薦系統 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;3分工作量&#xff1a;3分創新點&#xff1a;4分 該項目較為新穎&…

軟件壓力測試對軟件產品起到什么作用?

一、軟件壓力測試是什么? 軟件壓力測試是一種通過模擬正常使用環境中可能出現的大量用戶和大數據量的情況&#xff0c;來評估軟件系統在壓力下的穩定性和性能表現的測試方法。在軟件開發過程中&#xff0c;經常會遇到一些性能瓶頸和穩定性問題&#xff0c;而軟件壓力測試的作…

react-codemirror2 編輯器需點擊一下或者延時才顯示數據的問題

現象&#xff1a; <Codemirror/>組件的數據已經賦上值的情況下&#xff0c;初始狀態不渲染數據&#xff0c;需要點擊編輯框獲取焦點后才展示&#xff0c;或者延遲了幾秒才顯示出來。 原因&#xff1a; 指定了一些依賴的版本&#xff0c;可能不兼容了一些功能&#xff0c…

C# int ? 關鍵字使用方法

使用C#的時間也不算短。 但是今天看到了一個從來沒有見過的寫法 Int &#xff1f;這是個什么寫法&#xff0c;沒見過啊&#xff0c;百度了查一下&#xff0c;也在這里記錄一下。 1、int? 關鍵字說明 (1)、int? 表示一個int類型,且該int類型可空,如果不加?的話,那么int類…

C語言刷題指南(一)

&#x1f4d9;作者簡介&#xff1a; 清水加冰&#xff0c;目前大二在讀&#xff0c;正在學習C/C、Python、操作系統、數據庫等。 &#x1f4d8;相關專欄&#xff1a;C語言初階、C語言進階、數據結構刷題訓練營、有感興趣的可以看一看。 歡迎點贊 &#x1f44d; 收藏 ?留言 &am…