虚拟化似乎搞乱绑定的属性

问题描述:

我有一个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

我终于想出了如何解决这个问题:如果有其他人遇到类似的问题,这可能是因为您正在处理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从未因某种原因被调用,也会发生同样的情况。

它在这种特定的情况似乎有点愚蠢,但它可以得到大量用户控件相当混乱有很多属性和子属性