溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Silverlight ItemsControl詳細(xì)解析+解惑

發(fā)布時(shí)間:2020-07-10 08:09:07 來源:網(wǎng)絡(luò) 閱讀:406 作者:hamu01 欄目:編程語言

Silverlight最強(qiáng)大的地方就在于定義控件了,Silverlight提供了非常靈活和高效的控件定義方式,幾乎可以實(shí)現(xiàn)任何復(fù)雜的控件實(shí)現(xiàn),對(duì)于快速開發(fā)應(yīng)用程序有著重要的意義。在Silverlight中一般將控件分為兩大類:

  • 非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定義?
    Silverlight ItemsControl詳細(xì)解析+解惑
  • 下面的代碼是如何實(shí)現(xiàn)多級(jí)數(shù)據(jù)綁定的,明明只使用了一級(jí)的DataTemplate?
    <sdk:HierarchicalDataTemplate x:Key="DataTemplate1" ItemsSource="{Binding SubFolders}">
        <Grid>
            <TextBlock TextWrapping="Wrap" Text="{Binding FolderName}"/>
        </Grid>
    </sdk:HierarchicalDataTemplate>

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):
     Silverlight ItemsControl詳細(xì)解析+解惑
  • GetContainerForItemOverride,如果IsItemItsOwnContainerOverride返回false,就執(zhí)行該方法,這個(gè)方法主要是為ItemsControl的每個(gè)Item返回一個(gè)ItemContainer對(duì)象
  • PrepareContainerForItemOverride,這個(gè)方法在準(zhǔn)備顯示每個(gè)Item之前做的一系列的準(zhǔn)備工作,最主要的操作包括:
    1. 就是設(shè)置每個(gè)ItemContainer的ContentTemplate,這里也說明ItemContainer一般都為ContentControl,否則ItemsControl的ItemTemplate設(shè)置就沒有任何意義
    2. 如果ItemsControl設(shè)置了DisplayMemberPath的話,ItemsControl就生成一個(gè)DisplayMemberTemplate的內(nèi)部類,這個(gè)類本質(zhì)上是一個(gè)DataTemplate,從DataTemplate繼承,其使用TextBlock綁定DisplayMemberPath指定的屬性路徑
    3. 使用ItemsControl的ItemContainerStyle設(shè)置了ItemContainer的Style

關(guān)于這個(gè)方法需要說明的幾點(diǎn)是:

      1. ItemTemplate和DisplayMemberPath不能同時(shí)設(shè)置,否則會(huì)拋出異常
      2. 如果自定義的ItemsControl在顯示Item時(shí)出現(xiàn)問題的話,就檢查是否正確的重寫了該方法,比如是否覆蓋了base的實(shí)現(xiàn),而且還沒有正確設(shè)置ItemTemplate、ItemContainer這些屬性
  • ClearContainerForItemOverride,這個(gè)方法在ItemsControl中Item被從界面顯式中移除時(shí)執(zhí)行,用來清理ItemContainer使用的資源,可以在這里解注冊(cè)ItemContainer注冊(cè)的事件等操作

未完待續(xù)…………………

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI