0

私は最近、コンテナーがスクロールしてビューに出入りするときにコンテナーをリサイクルする VirtualizingWrapPanel の実装を作成しました。

ときどき、コントロールによってレンダリングされたコンテンツが、実際には現在のデータではなく、以前に含まれていたデータであることに気付きました。新しいレンダー呼び出しを強制するアクションをコントロールで実行すると、正しいデータが表示されるようにコントロールが更新されます。

これは ItemContainerGenerator リサイクルのバグですか、それとも私のリサイクル コードにある可能性が高いですか? コード ビハインドで各バインディング式を明示的に記述せずに、(新しいコンテンツでコントロールを更新した後に) すべてのバインディングを強制的に更新する方法はありますか?

4

1 に答える 1

1

過去に、仮想化を使用しているときに、表示された後にDataContextが変更されることを実際には予期していなかったカスタムコントロールを使用しているときに、このような問題が発生しました。

パネルが(聞こえるように)新しいDataContextを再利用されたオブジェクトに正しく渡している場合、再利用されたオブジェクトが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?
}
于 2009-10-07T12:25:18.293 に答える