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

时间:2017-06-24 12:02:41

标签: c# data-binding uwp dependency-properties virtualization

我有一个listview,作为一个数据窗口,有一个相对复杂的UserControl,有一些绑定到它的属性。

ItemsPanel如下:

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

我的列表视图通常包含大约70个项目,但是我遇到了一个很大的问题:

每次我向上滚动大约30个项目然后再向下移动时,属性似乎已经搞砸了,其中一些似乎已经切换到更高级别的项目属性。

例如,如果我之前有以下内容:

  • 属性A = 1
  • 属性A = 2
  • 属性A = 3

向上滚动并向后滚动后,我会:

  • 属性A = 1
  • 属性A = 2
  • 属性A = 1

如何确保项目保留其属性或正确重新加载?

1 个答案:

答案 0 :(得分:0)

我终于想出了如何解决这个问题:如果其他人遇到类似问题,可能是因为您正在处理PropertyChanged事件而不重置缺少的属性或为null。例如,如果这是listview的datatemplate中的usercontrol:

<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,也会发生同样的情况。

在这种特殊情况下看起来有点愚蠢,但是对于具有大量属性和子属性的大型用户控件来说,它会变得非常混乱