【问题标题】: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?
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多