我最近写了一个VirtualizingWrapPanel的实现,它在滚动进出视图时回收容器。
有时我注意到控件呈现的内容实际上是先前包含的数据,而不是当前数据。对强制执行新渲染调用的控件执行任何操作都会更新控件,以便显示正确的数据。
这可能是ItemContainerGenerator回收中的错误还是更有可能出现在我的回收代码中?有没有办法可以强制我的所有绑定更新(在用新内容更新控件之后)而不在代码中明确地写入每个绑定表达式?
答案 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?
}