Windows Phone 提升開發效率(一)使用d:DataContext添加設計時Binding


【問題的提出】

 

在開發過程中我們經常會遇到將UI同學提供的效果圖轉化成實際的頁面,而在這過程中,多數時候Blend等設計工具默認情況下並不能提供很好的可視化支持。

舉個簡單的例子來說下吧:

   

   

很簡單的一個頁面,里面longlistSelector Binding到了ViewModel的DataList上面DataList的定義如下:

   

   

非常簡單的邏輯,那么我們在設計ItemTemplete的時候我們的設計器是如何顯示的呢?

   

   

沒有看錯,多數情況下我們的頁面除了標題以外都是漆黑一篇(這個例子里面連標題都沒有=。=),因為此時並沒有數據的加載(真實情況DataList的數據可能來自服務器)

   

下面我們的關鍵來了

 

【整點酷的!】

 

 如何能讓設計器設計的時候有Demo數據顯示呢?

 

先看代碼隨后來解釋:

   

   

我們在構造函數中做了一個判斷,判斷了下IsInDesignTool屬性,這個屬性的作用是個啥呢?可能你已經想到了(相信你沒有=。=)

 

我們需要從根本說起:

 

考慮一個問題,Blend或者VS的可視化設計器里面為什么會顯示出來UI呢?

答案是,Blend或者VS的可視化設計器會跑我們的代碼,然后來顯示出來,當我們Build之后,設計器會進入頁面的構造函數,調用InitializeComponent();方法來將UI渲染然后呈現給我們。

   

回到主題,上面IsInDesignTool屬性就是來標識當前這段代碼的執行者是否為設計器(這個屬性在運行時始終為False)

如此我們這個ViewModel的意思就很明顯了,當設計器跑這段代碼的時候,我們就偽造一組數據給它。

   

下面一個問題就來了,ViewModel在運行時被設置到Page上面,那設計器又如何才能跑到ViewModel的構造函數中呢?

我們添加如下代碼到Xaml中:

   

   

注意d:DataContext屬性,他的作用就是告訴設計器:LayoutRoot在設計器執行代碼的時候DataContext是MainPageViewModel,這個ViewModel應該在設計時創建。

如此我們的障眼法就成功了,設計器跑起來代碼之后,傻乎乎的去創建MainPageViewModel,在構造的時候又傻乎乎的拿到了一組假數據=。=

   

於是就出現了下面的顯示效果:

 

   

Bingo!

   

上面這個技巧對於開發人員可以帶來效率上的飛升,至少我發現了這一點之后,省了很多布局時間,:-)

   

如需要詳細Demo工程歡迎留言,或者加入

QQ群:182659848


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM