新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SilverlightItemsControl詳細(xì)解析+解惑
Silverlight最強(qiáng)大的地方就在于定義控件了,Silverlight提供了非常靈活和高效的控件定義方式,幾乎可以實(shí)現(xiàn)任何復(fù)雜的控件實(shí)現(xiàn),對(duì)于快速開發(fā)應(yīng)用程序有著重要的意義。在Silverlight中一般將控件分為兩大類:
目前創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、上思網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
- 非ItemsControl,像TextBox、Button等,表示單一的一個(gè)控件,這樣的控件大部分開發(fā)者都可以很好的理解和掌握
- ItemsControl,像ListBox、ComboBox、TreeView等,用來承載多個(gè)控件,這樣的控件給很多開發(fā)者帶來困惑,不是很好理解,尤其是在定義ItemsControl控件時(shí)。希望通過本文能夠讓所有還對(duì)ItemsControl有困惑的開發(fā)者,能夠更清晰的認(rèn)識(shí)ItemsControl
那些困惑
- 現(xiàn)在有如下的需求:我想添加如下的一個(gè)集合控件,期望選中項(xiàng)出現(xiàn)三角箭頭的提示,應(yīng)該是在DataTemplate中定義,還是在ListBoxItem中Template定義?
- 下面的代碼是如何實(shí)現(xiàn)多級(jí)數(shù)據(jù)綁定的,明明只使用了一級(jí)的DataTemplate?
ItemsControl剖析
這里著重介紹其中幾個(gè)關(guān)鍵方法,透徹理解這些方法是使用和定義ItemsControl的關(guān)鍵:
- IsItemItsOwnContainerOverride,ItemsControl會(huì)遍歷Items集合,對(duì)每個(gè)item調(diào)用該方法(注:對(duì)于設(shè)置ItemsSource的話,最終都會(huì)將ItemsSource中的每一項(xiàng)都添加到Items集合中),如果item類型和ItemsControl的每個(gè)Item的Container類型不匹配,返回false,否則返回true,如果要實(shí)現(xiàn)自定義的集合控件,這里就是該集合控件需要的ItemContainer類型。下圖是ListBox中該方法的實(shí)現(xiàn):
- GetContainerForItemOverride,如果IsItemItsOwnContainerOverride返回false,就執(zhí)行該方法,這個(gè)方法主要是為ItemsControl的每個(gè)Item返回一個(gè)ItemContainer對(duì)象
- PrepareContainerForItemOverride,這個(gè)方法在準(zhǔn)備顯示每個(gè)Item之前做的一系列的準(zhǔn)備工作,最主要的操作包括:
- 就是設(shè)置每個(gè)ItemContainer的ContentTemplate,這里也說明ItemContainer一般都為ContentControl,否則ItemsControl的ItemTemplate設(shè)置就沒有任何意義
- 如果ItemsControl設(shè)置了DisplayMemberPath的話,ItemsControl就生成一個(gè)DisplayMemberTemplate的內(nèi)部類,這個(gè)類本質(zhì)上是一個(gè)DataTemplate,從DataTemplate繼承,其使用TextBlock綁定DisplayMemberPath指定的屬性路徑
- 使用ItemsControl的ItemContainerStyle設(shè)置了ItemContainer的Style
關(guān)于這個(gè)方法需要說明的幾點(diǎn)是:
- ItemTemplate和DisplayMemberPath不能同時(shí)設(shè)置,否則會(huì)拋出異常
- 如果自定義的ItemsControl在顯示Item時(shí)出現(xiàn)問題的話,就檢查是否正確的重寫了該方法,比如是否覆蓋了base的實(shí)現(xiàn),而且還沒有正確設(shè)置ItemTemplate、ItemContainer這些屬性
- ClearContainerForItemOverride,這個(gè)方法在ItemsControl中Item被從界面顯式中移除時(shí)執(zhí)行,用來清理ItemContainer使用的資源,可以在這里解注冊(cè)ItemContainer注冊(cè)的事件等操作
未完待續(xù)…………………
文章標(biāo)題:SilverlightItemsControl詳細(xì)解析+解惑
URL地址:http://www.dlmjj.cn/article/ppgoop.html