<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WPF列表控件中對于相同引用的對象奇怪的行為

      WPF中常用的List控件如ListBox, ListView 等,在內置的Item對象是同一個對象的引用時,選擇這些Item時候,這些相同引用的Item會同時被選中。如下圖:

      image

       

      不管是string還是復雜對象,只要是相同的引用,就會產生問題。為此我們就需要研究下List控件式如何實現的。List控件都繼承于 Selector 對象,用 Reflector 將 Selector 類反編譯后,我們會發現它實現了基本的Item增加刪除選擇的行為。Selector 類在用戶選擇完畢后,他需要將內部的selectedItems集合的值反映到Visual上,這就需要用到了一個內部方法:UpdateSelectedItems

      Code Snippet
      1. private void UpdateSelectedItems()
      2. {
      3.     IList selectedItemsImpl = this.SelectedItemsImpl;
      4.     if (selectedItemsImpl != null)
      5.     {
      6.         InternalSelectedItemsStorage storage = new InternalSelectedItemsStorage(selectedItemsImpl.Count) {
      7.             UsesItemHashCodes = this._selectedItems.UsesItemHashCodes
      8.         };
      9.         for (int i = 0; i < selectedItemsImpl.Count; i++)
      10.         {
      11.             object t = selectedItemsImpl[i];
      12.             if (this._selectedItems.Contains(t) && !storage.Contains(t))
      13.             {
      14.                 storage.Add(t);
      15.             }
      16.             else
      17.             {
      18.                 selectedItemsImpl.RemoveAt(i);
      19.                 i--;
      20.             }
      21.         }
      22.         foreach (object obj3 in (IEnumerable) this._selectedItems)
      23.         {
      24.             if (!storage.Contains(obj3))
      25.             {
      26.                 selectedItemsImpl.Add(obj3);
      27.             }
      28.         }
      29.     }
      30. }

      好,我們重點看下這個方法(其他內部如何實現選擇的方法很簡單,不多敘述,大家可以自己在Reflector中看)。我們知道,Selector 將所有選擇到的Item存放在內部的selectedItems中和一個叫做SelectedItemsImpl IList中,這里我們看到代碼從SelectedItemsImpl中逐個取出對象(其實只是對象的引用)并在selectedItems 和一個InternalSelectedItemsStorage結構中尋找是否已 經存在這個對象,對于相同引用的對象selectedItems中當然是存在的,而他并不在這個新構成的InternalSelectedItemsStorage中,所以會在storage中增加一個新的對象key。然后就是最后一個if塊,在selectedItemsImpl增加一個選中對象。這是注意,舊的對象并沒有被從selectedItemsImpl移除,這就造成一個對象重復被選擇,但又沒法移除。

      總結:在使用ListBox時候,注意所添加的引用是否相同,要避免此類問題。通常是使用clone體來對內容相同的對象來重復添加。

       

      WPF QQ交流群: 113404016  歡迎加入

      posted @ 2010-06-02 21:26  Jarrey  閱讀(663)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产日韩一区二区四季| 无码av免费毛片一区二区| 成人啪啪高潮不断观看| 艳妇乳肉豪妇荡乳xxx| 亚洲国产成人久久综合人| 熟女少妇精品一区二区| 国产无套内射又大又猛又粗又爽 | 四虎在线成人免费观看| 色爱av综合网国产精品| 亚洲精品香蕉一区二区| 国产老肥熟一区二区三区| 人妻系列无码专区久久五月天| 国产午夜精品亚洲精品国产 | 深夜在线观看免费av| 免费国产一区二区不卡| 青青国产揄拍视频| 在线看av一区二区三区| 五月综合婷婷开心综合婷婷| 国内精品久久毛片一区二区| 成人福利一区二区视频在线| 午夜成人精品福利网站在线观看| 亚洲老熟女一区二区三区| 丝袜美腿视频一区二区三区 | 亚洲国产精品一区二区第一页| 鲁大师在线视频播放免费观看| 亚洲永久精品免费在线看| 中文字幕日韩精品有码| 国产日产欧产精品精品| a4yy私人毛片| 国产成A人片在线观看视频下载| av午夜福利一片免费看久久| 高清dvd碟片 生活片| 自拍偷拍第一区二区三区| 中文字幕在线视频不卡| 97精品伊人久久久大香线蕉| 女人与牲口性恔配视频免费| 91国产自拍一区二区三区| 深夜免费av在线观看| 国产成人精品中文字幕| 亚洲国产精品美日韩久久| 秋霞在线观看片无码免费不卡|