WPF的依賴項屬性

来源:http://www.cnblogs.com/dzw2017/archive/2017/05/23/6895807.html
-Advertisement-
Play Games

WPF的依賴項屬性 屬性與事件是.NET抽象模型的核心部分。WPF使用了更高級的依賴項屬性(Dependency Property)功能來替換原來.NET的屬性,實現了更高效率的保存機制,還添加了附加功能,如屬性變更通知以及強制回調、屬性值繼承(在邏輯樹中向下傳播預設屬性值的能力)以及屬性有效性驗證 ...


    WPF的依賴項屬性

     屬性與事件是.NET抽象模型的核心部分。WPF使用了更高級的依賴項屬性(Dependency Property)功能來替換原來.NET的屬性,實現了更高效率的保存機制,還添加了附加功能,如屬性變更通知以及強制回調、屬性值繼承(在邏輯樹中向下傳播預設屬性值的能力)以及屬性有效性驗證等。同時,依賴項屬性也是WPF許多重要功能的基礎,包括動畫、數據綁定以及樣式。

     依賴項屬性的使用基礎

      使用依賴項屬性包括三個部分,定義依賴項屬性;註冊依賴項屬性以及添加屬性包裝器。

     定義依賴項屬性,使用三個修飾詞,public、static、readonly。數據類型為DependecyProperty,而每一個依賴項屬性都會有一個去掉“Property”的CLR屬性和他對應,而我們在xaml中訪問的都是CLR屬性。

     註冊依賴項屬性,這也是依賴項屬性的真正含義,在於定義一個DependecyProperty屬性後外部訪問只能通過其對應的CLR屬性,其本質通過DependecyProperty.Register註冊,寫入了DependecyProperty類中的Hastable中,所有的依賴屬性都寫入這個哈希表中,哈希表的key值由依賴項屬性的name+type組成,保證了key值的唯一性。當需要設置依賴項屬性的值時,則會為這個對象創建一個數組,數據類型為EffectiveValueEntry,包含了一個屬性的index,DependencyProperty提供了一個方法GetglobalIndex來獲取此屬性在Hashtable中的位置,value當然就可以在此取出。

       註冊依賴項屬性,在這一步驟中,我們主要負責提供5個要素:

  1.       屬性名
  2.       屬性使用的數據類型
  3.       擁有該屬性的類型
  4.       一個具有附加屬性設置的(Framework)PropertyMetadata對象,可選
  5.      一個用於驗證屬性的回調函數 ValidateValueCallback(驗證回調),可選

       其中的FrameworkPropertyMetadata依賴屬性元數據對象,是功能最為豐富的一項要素,元數據中可能包括WPF不同級別的依賴屬性的特征,這些特征報告各種服務(如 WPF框架級別的佈局引擎和屬性繼承邏輯)的信息和狀態,大致包括以下信息:

  •      依賴項屬性的預設值
  •      更改通知的回調實現的引用
  •      強制回調實現的引用
public static DependencyProperty Register(
    string name,--依賴項對象的名稱
    Type propertyType,--屬性的類型
    Type ownerType,--依賴項對象的所有者類型
    PropertyMetadata typeMetadata,--依賴項對象的屬性元數據
    ValidateValueCallback validateValueCallback--對回調的引用
)

public PropertyMetadata(
    Object defaultValue,--依賴項對象的預設值
    --每當屬性的有效值更改時,屬性系統都將調用該處理程式實現
    PropertyChangedCallback propertyChangedCallback,
    --每當屬性系統對該屬性調用 CoerceValue 時都將調用此處理程式實現
    CoerceValueCallback coerceValueCallback
)
--核心級別具有呈現/用戶界面影響的非框架屬性提供屬性元數據
public UIPropertyMetadata(
    Object defaultValue,
    PropertyChangedCallback propertyChangedCallback,
    CoerceValueCallback coerceValueCallback,
    bool isAnimationProhibited--是否禁止動畫處理,預設為false
)
--框架的屬性系統
public FrameworkPropertyMetadata(
    Object defaultValue,
    --元數據選項標誌(FrameworkPropertyMetadataOptions 值的組合)
    FrameworkPropertyMetadataOptions flags,
    PropertyChangedCallback propertyChangedCallback,
    CoerceValueCallback coerceValueCallback,
    bool isAnimationProhibited,
    --此屬性的綁定時使用的 UpdateSourceTrigger
    UpdateSourceTrigger defaultUpdateSourceTrigger
)

      依賴項屬性值變更回調、強制回調以及驗證回調的執行順序如下:

      驗證:ValidateValueCallback

      強制值:CoerceValueCallback

      回調:PropertyChangedCallback

     添加屬性包裝器,最後一個步驟是使用傳統的.NET屬性封裝WPF的依賴項屬性,封裝函數中set、get訪問器分別調用了DependecyObjec基類中定義的GetValue()和SetValue()方法。

      依賴項屬性在數據綁定中的應用

        

 

 

         數據綁定中,有5個要素:

  1.    Source:確定哪個對象作為數據源
  2.    Target:確定哪個對象作為目標
  3.    聲明一個Binding實例,用於關聯數據
  4.    數據源的Path,可以是CLR屬性也可以是依賴項屬性,甚至屬性的子屬性
  5.    目標的D.P.,只能是依賴項屬性

     D.P.的全稱是“Dependency Property”,直譯過來就是“依賴式屬性”,意思是說它自己本身是沒有值的,它的值是“依賴”在其它對象的屬性值上、通過Binding的傳遞和轉換而得來的。表現在例子里,它就是Target上的被數據所驅動的聯動屬性了!

     其中值得註意的是,當源數據發生改變時,需要通知界面數據變更,併進行界面更新。如若,數據源的Path是一個普通屬性,即需要實現INotifyPropertyChanged介面,以此來通知界面變更;而如果數據源的Path是一個依賴項屬性,其中INotifyPropertyChanged是為DependencyObject服務的,即可自動發生界面更新事件。

     在數據綁定中,也凸顯了Winform與WPF的巨大差異,WPF真正意義上實現了 “數據驅動界面” 的模式。換而言之,數據是底層、是心臟,數據變了作為表層的UI就會跟著變、將數據展現給用戶;如果用戶修改了UI元素上的值,相當於透過UI元素直接修改了底層的數據;數據處於核心地位,UI處於從屬地位。數據是程式的發動機(驅動者)、UI成了幾乎不包含任何邏輯專供用戶觀察數據和修改數據的“視窗”(被驅動者)。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首寫博客練練手,第一節基礎中的基礎,覺得太簡單的直接跳過啊,哈哈,IDE是VS2012英文版~~ 1.啟動vs2012,選擇file(文件)>new(新建)>project(項目) 2.項目類型選visual c#,模版選console application(控制台應用程式),項目名稱輸入Hell ...
  • 應用程式分層設計 應用程式分層屬於關註點分離的一種形式,可以通過命名空間、文件夾或採用單獨的項目來實現。 下圖為一個採用分層設計的項目結構 ASPPatterns.Chap3.Layered.Repository依賴於ASPPatterns.Chap3.Layered.Model ASPPatter ...
  • 1.代碼是轉載的,此處記錄一下。 ...
  • 在做一個流程的時候,碰到了下麵的表數據直接從上表中獲取,並且為不可編輯狀態,沒有增加和刪除行的按鈕。一開始使用的是ComputationRule屬性,但是有一項是日期空間,沒有這個屬性,不知道怎麼處理,下麵是官方論壇給出的處理例子:在表單中,控制項類型為子表的數據項,其對於的前臺代碼其實就是Table ...
  • 1.在web中瀏覽pdf文件。 2.支持大多數主流瀏覽器,包括IE8 3.參考網址: https://pdfobject.com/ http://mozilla.github.io/pdf.js/ 引用的js文件下載地址:http://download.csdn.net/detail/wz12288 ...
  • 在web開發中經常會遇到在內部代碼中獲取Html,這些Html是需要和數據進行一起渲染。並不是直接把Html代碼返回給客戶端。這樣的做法有很多應用場景,例如分頁、Ajax一次性獲取幾段Html片段、生成郵件發送模板、生成Html靜態頁面等等。比較簡單的或者容易想到的做法就是直接拼接Html,當然這肯 ...
  • 本文主要是利用微軟自帶的控制項ReportViewer進行報表設計的小例子 涉及知識點: ReportViewer :位於Microsoft.Reporting.WinForms命名空間, 主要用於報表的顯示 Report:報表,以rdlc結尾的文件,可視化設計報表模板。 報表數據:內置欄位,參數,圖 ...
  • 什麼是委托? 官方解釋 委托是一種定義方法簽名的類型。當實例化委托時,您可以將其實例與任何具有相容簽名的方法相關聯。您可以通過委托實例調用方法。 個人理解 委托是一個持有一個或多個方法的對象,並且該對象可以被執行,可以被傳遞 使用方法 首先創建一個類或多個類並且創建方法有無參數都可以 使用關鍵字 d ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...