2017-06-24 23 views
1

我有一個listview,作爲一個數據模板,有一個相對複雜的UserControl,有一些屬性綁定到它。虛擬化似乎搞亂綁定的屬性

的ItemsPanel如下:

<ListView.ItemsPanel> 
    <ItemsPanelTemplate> 
      <ItemsStackPanel VerticalAlignment="Bottom" ItemsUpdatingScrollMode="KeepLastItemInView"/> 
     </ItemsPanelTemplate> 
</ListView.ItemsPanel> 

我的列表視圖中一般含有約70項,不過我遇到一個相當重大的問題:

我每次向上滾動約30項,然後回落下來,屬性似乎已經變得混亂了,其中一些似乎已經改變了更高的項目屬性。

例如,如果在我有以下內容:

  • 屬性A = 1
  • 屬性A = 2
  • 屬性A = 3

後向上滾動和背面向下我會有:

  • property A = 1
  • 物業A = 2
  • 物業A = 1

我怎樣才能確保項目一直保持它們的性質或正確重載它們?

+0

一個什麼樣的結果,如果你阻止虛擬化嗎?你有[MCVE]項目在我們這邊進行測試? –

+0

我無法重現此問題。正如@ SunteenWu-MSFT所說 - 你應該提供一個MCVE(你可能會在這個問題上找出問題)。 – Grx70

回答

0

我終於想出瞭如何解決這個問題:如果有其他人遇到類似的問題,這可能是因爲您正在處理PropertyChanged事件而不重置缺少或爲null的屬性。例如,如果這是一個列表視圖的DataTemplate的內部用戶控件:

<local:CustomControl CustomText={Binding text}/>

它被這樣處理:

public string CustomText   
    { 
     get { return (string)GetValue(CustomTextProperty); } 
     set { SetValue(CustomTextProperty, value); } 
    } 
    public static readonly DependencyProperty CustomTextProperty = DependencyProperty.Register(
     nameof(CustomText), 
     typeof(string), 
     typeof(CustomControl), 
     new PropertyMetadata(string.Empty, OnPropertyChanged)); 

    private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var instance = d as CustomControl; 
     if(instance.CustomText != "") 
      myTextBlock.Text = instance.CustomText; 
    } 

每次虛擬化回收一個CustomControl,如果以往任何時候都正在綁定到一個空字符串,因爲if(instance.CustomText != "")文本塊不會被更新,舊屬性會再次顯示。如果OnPropertyChanged從未因某種原因被調用,也會發生同樣的情況。

它在這種特定的情況似乎有點愚蠢,但它可以得到大量用戶控件相當混亂有很多屬性和子屬性