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