2009-09-25 51 views
0

我最近編寫了一個VirtualizingWrapPanel的實現,它可以在容器滾入和滑出時回收容器。Silverlight VirtualizingPanel回收容器顯示錯誤的內容

有時我注意到,控件呈現的內容實際上是以前包含的數據,而不是當前數據。對強制執行新的渲染調用的控件執行任何操作都會更新控件,使其顯示正確的數據。

這可能是一個在ItemContainerGenerator循環中的錯誤,還是更有可能在我的回收代碼中?有沒有一種方法可以強制所有的綁定更新(在用新內容更新控件之後),而不用在代碼後面明確寫入每個綁定表達式?

回答

1

當我們使用自定義控件時,在使用虛擬化時,我發現過去非常類似這樣的問題,這些自定義控件實際上並不期望在顯示它們的DataContext時被更改。

如果你的面板是正確的(就像聽起來那樣),將新的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? 
}