我为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
为以下模板(通过 XAML 说明):
<StackPanel>
<TextBlock Text="{Binding Path=DataValue}" />
<ContentControl Content="{Binding Path=DataEditor}" />
</StackPanel>
DataGrid
最初填充和显示时,一切正常且符合预期。现在,如果我尝试滚动网格,则会发生以下异常:
指定元素已经是另一个元素的逻辑子元素。先断开它。
此异常与网格的行虚拟化和绑定Content
到DataEditor
内部单元格模板有关。如果我关闭行虚拟化,一切正常,但网格性能变得非常糟糕,所以它不是一个选项。
您是否知道DataGrid
虚拟化在幕后工作,加载/卸载行时会发生什么以及可能导致此错误的原因是什么?有什么解决方法吗?
注意:我不能ContentTemplate
在单元格模板中使用绑定单元格数据编辑器(在许多地方都建议作为解决方法),因为我必须手动创建和初始化这个单元格编辑器。