三個概念:DataBinding,Dependency Property 與DataTemplate

WPF 核心概念詳解:DataBinding、Dependency Property 和 DataTemplate

1. DataBinding (數據綁定)

基本概念

DataBinding 是 WPF 的核心機制,用于在 UI 元素和數據源之間建立自動同步關系。

關鍵特性

  • 雙向綁定:數據變化自動反映到 UI,UI 變化也能更新數據源

  • 綁定模式

    • OneWay:源→目標

    • TwoWay:源?目標

    • OneWayToSource:目標→源

    • OneTime:僅初始化時綁定一次

基本語法

<TextBox Text="{Binding Path=UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

代碼示例

public class User : INotifyPropertyChanged
{private string _name;public string Name{get => _name;set { _name = value; OnPropertyChanged(); }}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string name = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));}
}// 在窗口或控件中設置數據上下文
this.DataContext = new User { Name = "Alice" };

2. Dependency Property (依賴屬性)

基本概念

依賴屬性是 WPF 特有的屬性系統,支持:

  • 樣式設置

  • 數據綁定

  • 動畫

  • 屬性值繼承

  • 默認值和元數據

創建依賴屬性

public class MyControl : Control
{public static readonly DependencyProperty ValueProperty =DependencyProperty.Register("Value",                     // 屬性名稱typeof(int),                 // 屬性類型typeof(MyControl),           // 所有者類型new PropertyMetadata(0, OnValueChanged)); // 元數據public int Value{get { return (int)GetValue(ValueProperty); }set { SetValue(ValueProperty, value); }}private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){// 屬性變化時的處理邏輯}
}

依賴屬性優勢

  1. 內存效率:只有被修改的屬性才存儲實際值

  2. 內置變更通知:無需實現 INotifyPropertyChanged

  3. 屬性值繼承:如字體設置可沿可視化樹繼承

  4. 樣式和模板支持:可被樣式和模板輕松修改

3. DataTemplate (數據模板)

基本概念

DataTemplate 定義了如何顯示數據對象,將數據與可視化元素關聯。

基本用法

<ListBox ItemsSource="{Binding Users}"><ListBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Name}" FontWeight="Bold"/><TextBlock Text="{Binding Age}" Margin="5,0,0,0"/></StackPanel></DataTemplate></ListBox.ItemTemplate>
</ListBox>

高級用法

1. 根據類型自動選擇模板
<Window.Resources><DataTemplate DataType="{x:Type local:Student}"><!-- 學生類型的顯示方式 --></DataTemplate><DataTemplate DataType="{x:Type local:Teacher}"><!-- 教師類型的顯示方式 --></DataTemplate>
</Window.Resources><ContentControl Content="{Binding CurrentPerson}"/>
2. 帶命令的模板
<DataTemplate><Button Command="{Binding DataContext.SelectCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"CommandParameter="{Binding}"><TextBlock Text="{Binding Name}"/></Button>
</DataTemplate>

三者的協同工作

┌───────────────────────┐    ┌───────────────────────┐
│      Dependency       │    │                       │
│       Property        │?───┤     DataBinding       │
└───────────────────────┘    │                       │▲                     └───────────────────────┘│                                ▲│                                │
┌───────────────────────┐    ┌───────────────────────┐
│     DataTemplate      │    │        Model          │
│                       │    │                       │
└───────────────────────┘    └───────────────────────┘
  1. Dependency Property?提供數據綁定的目標

  2. DataBinding?連接 UI 元素和數據源

  3. DataTemplate?定義復雜數據對象的可視化方式

實際應用示例

綜合示例:人員列表應用

// Model
public class Person : INotifyPropertyChanged
{private string _name;public string Name{get => _name;set { _name = value; OnPropertyChanged(); }}// INotifyPropertyChanged 實現...
}// ViewModel
public class PeopleViewModel
{public ObservableCollection<Person> People { get; } = new ObservableCollection<Person>();public ICommand AddCommand { get; }public PeopleViewModel(){AddCommand = new RelayCommand(AddPerson);}private void AddPerson(){People.Add(new Person { Name = $"New Person {People.Count + 1}" });}
}
<!-- View -->
<Window x:Class="PeopleApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="People App" Height="350" Width="525"><Window.Resources><DataTemplate DataType="{x:Type local:Person}"><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Name}" Width="200"/><Button Content="Remove" Command="{Binding DataContext.RemoveCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"CommandParameter="{Binding}" Margin="5,0"/></StackPanel></DataTemplate></Window.Resources><DockPanel><Button DockPanel.Dock="Bottom" Content="Add Person" Command="{Binding AddCommand}" Margin="5" Padding="10,3"/><ListBox ItemsSource="{Binding People}" HorizontalContentAlignment="Stretch"/></DockPanel>
</Window>

總結對比表

特性DataBindingDependency PropertyDataTemplate
主要用途連接數據和UI擴展屬性系統定義數據可視化方式
關鍵優勢自動同步支持樣式/綁定/動畫數據與顯示分離
典型應用場景MVVM模式中的數據更新自定義控件開發列表/集合數據顯示
是否必需接口通常需要INotifyPropertyChanged不需要不需要
性能考慮大量綁定可能影響性能比CLR屬性更高效復雜模板可能影響渲染性能

這三種技術共同構成了 WPF 強大數據展示和交互能力的基礎,理解它們的原理和相互關系對于開發高質量的 WPF 應用至關重要。

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

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

相關文章

C語言教程(二十六):C 語言內存管理詳解

一、C 語言內存區域劃分 在 C 語言程序運行時,內存主要分為以下幾個區域: 1.1 棧區(Stack) 特點:由編譯器自動分配和釋放,主要存儲函數的局部變量、函數參數、返回地址等。棧區的內存分配和釋放是按照后進先出(LIFO)的原則進行的,速度快。示例: #include <stdio.…

騰訊云服務器性能提升全棧指南(2025版)

騰訊云服務器性能提升全棧指南&#xff08;2025版&#xff09; 一、硬件選型與資源優化 1. 實例規格精準匹配 騰訊云服務器提供計算型CVM、內存型MEM、大數據型Hadoop等12種實例類型。根據業務特性選擇&#xff1a; ? 高并發Web應用&#xff1a;推薦SA3實例&#xff0…

決策樹在電信客戶流失分析中的實戰應用

在當今數據驅動的時代&#xff0c;數據分析和機器學習技術在各行業的應用愈發廣泛。電信行業面臨著激烈的競爭&#xff0c;客戶流失問題成為影響企業發展的關鍵因素之一。如何準確預測客戶是否會流失&#xff0c;并采取相應措施挽留客戶&#xff0c;是電信企業關注的重點。決策…

【HCIA】VRRP

前言 二層交換機為了破環發明了堆疊&#xff0c;把幾臺實際的交換機視作一個虛擬的交換機&#xff0c;實現了鏈路的復用和環路的破壞。那么對應到三層的路由器&#xff0c;我們有 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;&#xff0c;它可以讓路由器分…

第15講:基礎柱狀圖與分組柱狀圖美化指南

目錄 ?? 一、為什么要關注柱狀圖的“美化”? ?? 二、基礎柱狀圖的構建邏輯(以 ggplot2 為例) ?? 三、美化細節全面升級 ? 1. 自定義配色與透明度 ? 2. 添加數值標簽 ? 3. 設置 y 軸刻度與坐標軸美學 ????? 四、分組柱狀圖(Grouped Bar Plot) ?? 五…

SV 仿真的常識

文章目錄 SV對verilog的擴展&#x1f4d8; 標準文檔名稱&#xff1a; 從SV到仿真通用過程解讀實例解讀 SV的仿真過程并行仿真顆粒度SV仿真調度調度區域 SV對verilog的擴展 SystemVerilog 和 Verilog 的語法標準由 **IEEE&#xff08;美國電氣和電子工程師協會&#xff09;**制…

蘇德戰爭前期蘇聯損失慘重(馬井堂)

蘇德戰爭前期&#xff08;1941年6月22日德國發動“巴巴羅薩行動”至1941年底至1942年初&#xff09;是蘇聯在二戰中損失最慘重的階段之一。以下是主要方面的損失概述&#xff1a; ?一、軍事損失? ?人員傷亡與俘虜? 至1941年底&#xff0c;蘇軍傷亡約?300萬人?&#xff…

聯邦學習的收斂性分析(全設備參與,不同本地訓練輪次)

聯邦學習的收斂性分析 在聯邦學習中,我們的目標是分析全局模型的收斂性,考慮設備異構性(不同用戶的本地訓練輪次不同)和數據異質性(用戶數據分布不均勻)。以下推導從全局模型更新開始,逐步引入假設并推導期望損失的遞減關系,最終給出收斂性結論。 1. 全局模型更新與泰…

多線程爬蟲中實現線程安全的MySQL連接池

多線程爬蟲中實現線程安全的MySQL連接池 在日常開發中&#xff0c;數據庫操作頻繁建立/關閉連接會帶來性能損耗&#xff0c;尤其在多線程場景中更容易出現連接復用、阻塞等問題。因此&#xff0c;本文介紹如何使用 Python 封裝一個 線程安全的 MySQL 連接池&#xff0c;并通過…

HTML:常用標簽(元素)匯總

文章目錄 一、標簽分類1、塊標簽與行標簽 二、排版標簽三、文本標簽1、常用2、不常用 四、圖片標簽五、超鏈接1、跳轉頁面2、跳轉文件或下載文件3、跳轉到錨點4、喚起本地應用 六、列表七、表格八、表單九、框架十、HTML實體十一、全局屬性十二、meta元信息 一、標簽分類 1、塊…

20250430在ubuntu14.04.6系統上完成編譯NanoPi NEO開發板的FriendlyCore系統【嚴重不推薦,屬于沒苦硬吃】

【開始編譯SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【這兩個目錄你在ubuntu14.04.6系統上貌似git clone異常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要單線程編譯文件系統&#xff0c;原因不明】 Y:…

【AI論文】CipherBank:通過密碼學挑戰探索LLM推理能力的邊界

摘要&#xff1a;大型語言模型&#xff08;LLMs&#xff09;已經展現出非凡的能力&#xff0c;尤其是最近在推理方面的進步&#xff0c;如o1和o3&#xff0c;推動了人工智能的發展。盡管在數學和編碼方面取得了令人印象深刻的成就&#xff0c;但在需要密碼學專業知識的領域&…

藝術與科技的雙向奔赴——高一鑫榮獲加州聯合表彰

2025年4月20日,在由M.A.D公司協辦的“智藝相融,共赴價值巔峰”(Academic and Artistic Fusion Tribute to the Summit of Value)主題發布會上,音樂教育與科技融合領域的代表人物高一鑫,因其在數字音樂教育與中美文化交流方面的杰出貢獻,榮獲了圣蓋博市議員Jorge Herrera和爾灣市…

【深度學習的靈魂】圖片布局生成模型LayoutPrompt(1)

&#x1f308; 個人主頁&#xff1a;十二月的貓-CSDN博客 &#x1f525; 系列專欄&#xff1a; &#x1f3c0;《深度學習理論直覺三十講》_十二月的貓的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻擋不了春天的腳步&#xff0c;十二點的黑夜遮蔽不住黎明的曙光 目…

Compose筆記(二十)--TextField

這一節主要了解一下Compose的TextField,TextField 是一個用于接收用戶文本輸入的 UI 組件,允許用戶通過鍵盤輸入、編輯或刪除文本。簡單用法總結如下: API value&#xff1a;當前輸入的文本內容。 onValueChange 含義&#xff1a;當用戶輸入文本時觸發的回調函數&#xff0c;參…

在Linux虛擬機下使用vscode,#include無法跳轉問題

總結&#xff1a;需要通過Linux指令來添加編譯器和壓縮文件&#xff0c;解壓&#xff0c;這樣獲得的編譯器會具有可執行權限類似于 -rwxr-xr-x 1 user user 12345 Apr 26 14:22 myscript.sh 如果你直接從window中拖入文件到Linux文件下&#xff0c;你需要自己來再度開啟可編譯…

ArcGIS+GPT:多領域地理分析與決策新方案

技術點目錄 AI大模型應用ArcGIS工作流程及功能prompt的使用技巧AI助力工作流程AI助力數據讀取AI助力數據編輯與處理AI助力空間分析AI助力遙感分析AI助力二次開發AI助力科研繪圖ArcGISAI綜合應用了解更多 ——————————————————————————————————…

基礎術語說明

車間&#xff1a;工廠內集中進行加工或裝配的獨立空間&#xff0c;配備設備、工具及人員&#xff0c;是生產活動的核心載體。 比如裝配車間、總裝車間、油漆車間等 生產線&#xff1a;以流水作業形式將原材料轉化為成品的設備與人員的組合系統&#xff0c;強調連續性和效率。…

Splunk 使用Role 實現數據隔離

很多人知道 Splunk 有很多自帶的Role, 今天我就要說說定制化的Role: 1: 在創建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 創建好新Role 后,在SAML 添加新的group 的時候,就可以看到Role 給某個group: 4: 這樣一個特定組的人來申請Splunk 權限,就可…

利用李雅普諾夫穩定性理論設計模型參考自適應系統(2.0)

上一篇介紹了利用李雅普諾夫穩定性理論設計模型參考自適應系統&#xff0c;通過在被控對象前面添加一個可調增益&#xff0c;然后利用李雅普諾夫穩定性理論設計增益的自適應率&#xff0c;使得被控對象輸出與參考模型輸出一致。本文將介紹在系統結構中引入前饋和反饋的結構&…