Silverlight VirtualizingPanel回收容器显示错误的内容

时间:2009-09-25 14:13:44

标签: data-binding silverlight-3.0 virtualization recycle

我最近写了一个VirtualizingWrapPanel的实现,它在滚动进出视图时回收容器。

有时我注意到控件呈现的内容实际上是先前包含的数据,而不是当前数据。对强制执行新渲染调用的控件执行任何操作都会更新控件,以便显示正确的数据。

这可能是ItemContainerGenerator回收中的错误还是更有可能出现在我的回收代码中?有没有办法可以强制我的所有绑定更新(在用新内容更新控件之后)而不在代码中明确地写入每个绑定表达式?

1 个答案:

答案 0 :(得分:1)

在我们使用自定义控件时,我曾经看到过这样的问题,当我们使用自定义控件时,实际上并不期望他们的DataContexts在显示后会被更改。

如果你的面板正确(听起来)将新的DataContexts交给重用的对象,那么听起来好像重用的对象没有处理DataContext正确更改。 (这个你在谈论的'render'调用然后将获取新的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?
}