我有一个listview,作为一个数据窗口,有一个相对复杂的UserControl,有一些绑定到它的属性。
ItemsPanel如下:
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel VerticalAlignment="Bottom" ItemsUpdatingScrollMode="KeepLastItemInView"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
我的列表视图通常包含大约70个项目,但是我遇到了一个很大的问题:
每次我向上滚动大约30个项目然后再向下移动时,属性似乎已经搞砸了,其中一些似乎已经切换到更高级别的项目属性。
例如,如果我之前有以下内容:
向上滚动并向后滚动后,我会:
如何确保项目保留其属性或正确重新加载?
答案 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,也会发生同样的情况。
在这种特殊情况下看起来有点愚蠢,但是对于具有大量属性和子属性的大型用户控件来说,它会变得非常混乱