1

DataGridアイテム(行とセル)のVMクラスを作成しました。CellのVMクラスを以下に示します。

public class ListGridCell : INotifyPropertyChanged 
{
    public ListGridCell(string Name)
    {
        // Init properties
        this.Name = Name;
        this.DataValue = null;
        this.DataEditor = null;
    }

    public string Name { get; private set; }

    private object _DataValue;
    public object DataValue
    {
        get { return _DataValue; }
        set { _DataValue = value; NotifyPropertyChanged("DataValue"); }
    }

    private FrameworkElement _DataEditor;
    public FrameworkElement DataEditor
    {
        get { return _DataEditor; }
        set { _DataEditor = value; NotifyPropertyChanged("DataEditor"); }
    }
    ...
}

DataGrid列とVMは、コードから完全に動的に構築されます。テンプレート列(DataGridTemplateColumn)を作成CellTemplateし、followindテンプレート(XAMLで示されている)に設定します。

<StackPanel>
    <TextBlock Text="{Binding Path=DataValue}" />
    <ContentControl Content="{Binding Path=DataEditor}" />
</StackPanel>

すべてが正常に機能し、DataGrid最初に入力されて表示されたときに期待どおりに機能します。ここで、グリッドをスクロールしようとすると、次の例外が発生します。

指定された要素は、すでに別の要素の論理的な子です。最初に切断します。

この例外は、グリッドの行の仮想化とセルテンプレート内へのバインドContentに関係しています。DataEditor行の仮想化をオフにすると、すべてが正常に機能しますが、グリッドのパフォーマンスが非常に悪くなるため、オプションではありません。

DataGrid仮想化が舞台裏で機能すること、行がロード/アンロードされるとどうなるか、そしてこのエラーの原因は何であるかを知っていますか?回避策はありますか?

注:ContentTemplateこのセルエディターを手動で作成して初期化する必要があるため、セルテンプレートでセルデータエディターのバインディングを使用することはできません(回避策として多くの場所で提案されています)。

4

1 に答える 1

0

解決しました。

これは明らかに、バインディングを仮想化と組み合わせてContentControl使用​​する場合のバグです。ContentDataGrid

すべてに切り替えると、ContentPresenter問題なく動作します。

作業セル テンプレートは次のとおりです。

<StackPanel>
    <TextBlock Text="{Binding Path=DataValue}" />
    <ContentPresenter Content="{Binding Path=DataEditor}" />
</StackPanel>
于 2012-06-23T09:42:58.663 に答える