【问题标题】:Silverlight VirtualizingPanel recycling containers display wrong contentSilverlight VirtualizingPanel 回收容器显示错误内容
【发布时间】:2023-03-14 15:01:01
【问题描述】:
我最近编写了一个 VirtualizingWrapPanel 的实现,它在容器滚动进出视图时回收容器。
有时我注意到控件呈现的内容实际上是以前包含的数据,而不是当前数据。对控件执行任何强制执行新渲染调用的操作都会更新控件,使其显示正确的数据。
这可能是 ItemContainerGenerator 回收中的错误,还是我的回收代码中更有可能?有没有一种方法可以强制更新所有绑定(在使用新内容更新控件之后),而无需在后面的代码中显式编写每个绑定表达式?
【问题讨论】:
标签:
data-binding
silverlight-3.0
virtualization
recycle
【解决方案1】:
过去,当我们使用自定义控件时,在使用虚拟化时,我曾遇到过类似的问题,这些控件真的不希望它们的 DataContexts 在显示后被更改。
如果您的面板正确(听起来)将新 DataContexts 交给重用对象,那么听起来重用对象没有正确处理 DataContext 更改。 (您所说的这个“渲染”调用将获取新的 DataContext 并显示它。)
如果您在控件中使用纯数据绑定,那么我有点难过。 (您的面板是否在获得新的 DataContext 后重新测量/排列控件?)
我们的解决方法是让我们的控件在其 DataContext 更改时进行监听。 (这对于调试虚拟化面板以测试 DataContext 是否正确输入也很有用。)
遗憾的是 OnDataContextChanged 方法在 Silverlight 中不公开,但您仍然可以通过绑定到 DC 更改来了解它们。
public MyClass()
{
InitializeComponent();
SetBinding(MyDataContextProperty, new Binding());
}
private static readonly DependencyProperty MyDataContextProperty =
DependencyProperty.Register("MyDataContext",
typeof(object),
typeof(MyClass),
new PropertyMetadata(DataContextChanged));
private static void DataContextChanged(
object sender,
DependencyPropertyChangedEventArgs e)
{
MyClass source = (MyClass)sender;
source.OnDataContextChanged();
}
private void OnDataContextChanged()
{
// My DataContext has changed; do whatever is needed.
// re 'render' in your case?
}