虚拟化似乎搞乱绑定的属性
问题描述:
我有一个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
我怎样才能确保项目一直保持它们的性质或正确重载它们?
答
我终于想出了如何解决这个问题:如果有其他人遇到类似的问题,这可能是因为您正在处理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从未因某种原因被调用,也会发生同样的情况。
它在这种特定的情况似乎有点愚蠢,但它可以得到大量用户控件相当混乱有很多属性和子属性
一个什么样的结果,如果你阻止虚拟化吗?你有[MCVE]项目在我们这边进行测试? –
我无法重现此问题。正如@ SunteenWu-MSFT所说 - 你应该提供一个MCVE(你可能会在这个问题上找出问题)。 – Grx70