2013-08-30 64 views
0

我正在實施自定義MultiSelectionTreeView。該控制繼承自TreeViewItem繼承的ItemsControl,MultiSelectionTreeViewItem。 由於龐大的數據集,我想綁定到這個控制我使用VirtualizationStackPanel作爲它的主機。虛擬化集合項目容器一致性

我將TreeViewItems IsSelected道具綁定到ViewModelClass IsSelected屬性。 當我在樹中向下滾動時,選定的項目將從視口中移出,並且IsSelected屬性將設置爲false(因爲MultiSelectionTreeViewItems與樹的斷開連接的虛擬化)。當我回滾一個新的物品容器(MultiSelectionTreeViewItem)時,根據ViewModel將該物品的IsSelected屬性設置爲true。

現在我不能決定是否因爲某個容器項目從/返回到視口或模型或視圖模型層發生更改而導致Selected事件發生。

更糟糕的是我無法設置斷開項目的IsSelected屬性。例如,使用Shift選擇更多項目並向下滾動。

我無法訪問我的控件實現中的viewmodel類。

有什麼想法?

+0

我會使用snoop並檢查值是否爲「本地」或 「綁定」,其中綁定值突出顯示爲綠色。 –

回答

0

如果您創建虛擬化的自定義實現,則可以解決此問題。碰巧,我找到了一本我在網上購買PDF的書的鏈接。本書在虛擬化(第8章)方面有很好的篇章...... WPF Control Development Unleashed

儘管我已經使用這些信息實現了自己的虛擬化面板,但我不得不說它很複雜。然而,如果你實現你自己的系統,也可以另一種屬性添加到您的視圖模型對象:

public bool IsRealized { get; set; } 

「實現」項是實際可見的項目,而不是在「虛擬化」項目只存在於內存中。所以,用這個屬性,你可以調整你的IsSelected屬性才反應過來時,IsRealized屬性是true

public bool IsSelected 
{ 
    get { return isSelected; } 
    set { if (IsRealized) { isSelected = value; NotifyPropertyChanged("IsSelected"); } 
} 

然後在您的自定義虛擬化面板,可以將每個項目實現時間或虛擬化的設置IsRealized屬性...我不得不警告你,雖然...... 做了很多工作。