WPF 教程:給 TreeView 添加 SelectedItem 雙向綁定支持(MVVM-Friendly)

🌲WPF 教程:給 TreeView 添加 SelectedItem 雙向綁定支持(MVVM-Friendly)

在 WPF 的 MVVM 應用中,TreeView 是非常常見的控件,但它有個“頑固”的缺陷:

?它的 SelectedItem 不是依賴屬性,無法直接綁定到 ViewModel

這對于追求純粹 MVVM 架構的開發者來說,很不友好。別擔心,本文將教你如何寫一個自定義 Behavior,讓 TreeView 也能優雅地綁定 SelectedItem


🧠 核心思路

利用 Microsoft.Xaml.Behaviors.Wpf 提供的 Behavior<T>,監聽 TreeView.SelectedItemChanged 事件,并同步綁定到 ViewModel,同時支持反向設置。


🧙?♂? 魔法代碼:BindableSelectedItemBehavior.cs

using Microsoft.Xaml.Behaviors;namespace MVBuilder.Behaviours
{/// <summary>/// 讓 WPF TreeView 支持 SelectedItem 雙向綁定的行為類。/// 應用于 TreeView 后,可在 ViewModel 中直接使用綁定方式訪問/設置選中項。/// </summary>public class BindableSelectedItemBehavior : Behavior<TreeView>{/// <summary>/// 可綁定的 SelectedItem 屬性(同步 TreeView.SelectedItem)/// </summary>public object? SelectedItem{get => GetValue(SelectedItemProperty);set => SetValue(SelectedItemProperty, value);}/// <summary>/// SelectedItem 依賴屬性注冊/// </summary>public static readonly DependencyProperty SelectedItemProperty =DependencyProperty.Register(nameof(SelectedItem),typeof(object),typeof(BindableSelectedItemBehavior),new UIPropertyMetadata(null, OnSelectedItemChanged));/// <summary>/// 當 SelectedItem 屬性變化時,選中對應的 TreeViewItem/// </summary>private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){if (e.NewValue is TreeViewItem item){item.SetValue(TreeViewItem.IsSelectedProperty, true);}}/// <summary>/// 附加行為時,注冊 TreeView 的 SelectedItemChanged 事件/// </summary>protected override void OnAttached(){base.OnAttached();AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;}/// <summary>/// 移除行為時,注銷事件,避免內存泄漏/// </summary>protected override void OnDetaching(){base.OnDetaching();AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;}/// <summary>/// 當 TreeView 選中項變化,更新 SelectedItem 依賴屬性(同步到 ViewModel)/// </summary>private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e){SetCurrentValue(SelectedItemProperty, e.NewValue);}}
}

🧰 NuGet 引用
確保你的項目安裝了以下包:

Microsoft.Xaml.Behaviors.Wpf

🔧 使用方式(XAML 示例)

<TreeView ItemsSource="{Binding TreeNodes}" x:Name="tree"><i:Interaction.Behaviors><behaviors:BindableSelectedItemBehavior SelectedItem="{Binding SelectedNode, Mode=TwoWay}" /></i:Interaction.Behaviors>
</TreeView>

ViewModel 示例代碼

private TreeNodeModel? _selectedNode;
public TreeNodeModel? SelectedNode
{get => _selectedNode;set => SetProperty(ref _selectedNode, value);
}

📌 總結一句話
WPF 的 TreeView 不支持綁定 SelectedItem?
沒事,我們自己寫個 Behavior 就能完美解決!🌟

希望這段小而強的代碼能幫你徹底解決 WPF 中 SelectedItem 無法綁定的問題,繼續寫出純粹、高質量的 MVVM 應用。

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

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

相關文章

Linux環境下內存錯誤問題排查與修復

最近這幾天服務器總是掉線&#xff0c;要查一下服務器的問題。可以首先查看一下計算機硬件&#xff0c;這是一臺某魚上拼湊的服務器&#xff1a; sudo lshw -shortH/W path Device Class Description system NF5270M3 (To be filled by O…

函數和模式化——python

一、模塊和包 將一段代碼保存為應該擴展名為.py 的文件&#xff0c;該文件就是模塊。Python中的模塊分為三種&#xff0c;分別為&#xff1a;內置模塊、第三方模塊和自定義模塊。 內置模塊和第三方模塊又稱為庫內置模塊&#xff0c;有 python 解釋器自帶&#xff0c;不用單獨安…

windows下載安裝遠程桌面工具RealVNC-Server教程(RealVNC_E4_6_1版帶注冊碼)

文章目錄 前言一、下載安裝包二、安裝步驟三、使用VNC-Viewer客戶端遠程連接&#xff0c;輸入ip地址&#xff0c;密碼完成連接 前言 在現代工作和生活中&#xff0c;遠程控制軟件為我們帶來了極大的便利。RealVNC - Server 是一款功能強大的遠程控制服務器軟件&#xff0c;通過…

Android Dagger 2 框架的注解模塊深入剖析 (一)

本人掘金號&#xff0c;歡迎點擊關注&#xff1a;https://juejin.cn/user/4406498335701950 一、引言 在 Android 開發中&#xff0c;依賴注入&#xff08;Dependency Injection&#xff0c;簡稱 DI&#xff09;是一種強大的設計模式&#xff0c;它能夠有效降低代碼的耦合度&…

HTML語言的空值合并

HTML語言的空值合并 引言 在現代Web開發中&#xff0c;HTML&#xff08;超文本標記語言&#xff09;是構建網頁的基礎語言。隨著前端技術的快速發展&#xff0c;開發者們面臨著大量不同的工具和技術&#xff0c;尤其是在數據處理和用戶交互方面。空值合并是一些編程語言中常用…

【數據結構】樹的介紹

目錄 一、樹1.1什么是樹&#xff1f;1.2 樹的概念與結構1.3樹的相關術語1.4 樹形結構實際運用場景 二、二叉樹2.1 概念與結構2.2 特殊的二叉樹2.2.1 滿二叉樹2.2.2 完全二叉樹 個人主頁&#xff0c;點擊這里~ 數據結構專欄&#xff0c;點擊這里~ 一、樹 1.1什么是樹&#xff1…

Muduo網絡庫實現 [十三] - HttpRequest模塊

目錄 設計思路 成員設計 模塊實現 設計思路 首先我們要先知道HTTP的請求的流程是什么樣子的&#xff0c;不然我們會學的很迷糊。對于HTTP請求如何到來以及去往哪里&#xff0c;我們應該很清楚的知道 HTTP請求在服務器系統中的傳遞流程是一個多層次的過程: 客戶端發起請求…

6. RabbitMQ 死信隊列的詳細操作編寫

6. RabbitMQ 死信隊列的詳細操作編寫 文章目錄 6. RabbitMQ 死信隊列的詳細操作編寫1. 死信的概念2. 消息 TTL 過期(觸發死信隊列)3. 隊列超過隊列的最大長度(觸發死信隊列)4. 消息被拒(觸發死信隊列)5. 最后&#xff1a; 1. 死信的概念 先從概念上解釋上搞清楚這個定義&#…

如何使用Selenium進行自動化測試?

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 對于很多剛入門的測試新手來說&#xff0c;大家都將自動化測試作為自己職業發展的一個主要階段。可是&#xff0c;在成為一名合格的自動化測試工程師之前&#…

洛谷題單3-P5724 【深基4.習5】求極差 最大跨度值 最大值和最小值的差-python-流程圖重構

題目描述 給出 n n n 和 n n n 個整數 a i a_i ai?&#xff0c;求這 n n n 個整數中的極差是什么。極差的意思是一組數中的最大值減去最小值的差。 輸入格式 第一行輸入一個正整數 n n n&#xff0c;表示整數個數。 第二行輸入 n n n 個整數 a 1 , a 2 … a n a_1,…

STM32智能手表——任務線程部分

RTOS和LVGL我沒學過&#xff0c;但是應該能硬啃這個項目例程 ├─Application/User/Tasks # 用于存放任務線程的函數 │ ├─user_TaskInit.c # 初始化任務 │ ├─user_HardwareInitTask.c # 硬件初始化任務 │ ├─user_RunModeTasks.c…

ubuntu22.04LTS設置中文輸入法

打開搜狗網址直接下載軟件&#xff0c;軟件下載完成后&#xff0c;會彈出安裝教程說明書。 網址:搜狗輸入法linux-首頁搜狗輸入法for linux—支持全拼、簡拼、模糊音、云輸入、皮膚、中英混輸https://shurufa.sogou.com/linux

SQL Server數據庫異常-[SqlException (0x80131904): 執行超時已過期] 操作超時問題及數據庫日志已滿的解決方案

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;獲得2024年博客之星榮譽證書&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發技術&#xff0c…

php8 ?-> nullsafe 操作符 使用教程

簡介 PHP 8 引入了 ?->&#xff08;Nullsafe 操作符&#xff09;&#xff0c;用于簡化 null 檢查&#xff0c;減少繁瑣的 if 語句或 isset() 代碼&#xff0c;提高可讀性。 ?-> Nullsafe 操作符的作用 在 PHP 7 及以下&#xff0c;訪問對象的屬性或方法時&#xff0…

WORD+VISIO輸出PDF圖片提高清晰度的方法

WORDVISIO輸出PDF圖片提高清晰度的方法 part 1: visio 繪圖part 2: word 導出 part 1: visio 繪圖 先在visio中把圖片和對應的文字調整為適合插入到文章中的尺寸&#xff1b; 在visio中把所有元素進行組合&#xff1b; 把組合后的圖片長和寬等比例放縮&#xff0c;如放大10倍…

重要頭文件下的函數

1、<cctype> #include<cctype>加入這個頭文件就可以調用以下函數&#xff1a; 1、isalpha(x) 判斷x是否為字母 isalpha 2、isdigit(x) 判斷x是否為數字 isdigit 3、islower(x) 判斷x是否為小寫字母 islower 4、isupper(x) 判斷x是否為大寫字母 isupper 5、isa…

基于大模型預測不穩定性心絞痛的多維度研究與應用

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的 1.3 國內外研究現狀 二、不穩定性心絞痛概述 2.1 定義與分類 2.2 發病機制 2.3 臨床表現 三、大模型技術原理與應用基礎 3.1 大模型介紹 3.2 在醫療領域的應用現狀 3.3 用于不穩定性心絞痛預測的可行性 四、術前預…

第一講—函數的極限與連續(一)

思維導圖 筆記 雙曲正弦函數及其反函數

Mac VM 卸載 win10 安裝win7系統

卸載 找到相應直接刪除&#xff08;移動到廢紙簍&#xff09; 可參考&#xff1a;mac如何卸載虛擬機win 下載 win7下載地址

免費送源碼:Java+SSM+Android Studio 基于Android Studio游戲搜索app的設計與實現 計算機畢業設計原創定制

摘要 本文旨在探討基于SSM框架和Android Studio的游戲搜索App的設計與實現。首先&#xff0c;我們詳細介紹了SSM框架&#xff0c;這是一種經典的Java Web開發框架&#xff0c;由Spring、SpringMVC和MyBatis三個開源項目整合而成&#xff0c;為開發企業級應用提供了高效、靈活、…