我为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
绑定(在许多地方建议使用它作为解决方法),因为我必须手动创建并初始化此单元格编辑器。 < / p>
答案 0 :(得分:0)
解决。
当ContentControl
绑定与Content
虚拟化结合使用时,这显然是DataGrid
中某处的错误。
切换到ContentPresenter
后,一切都完美无瑕。
工作单元格模板是:
<StackPanel>
<TextBlock Text="{Binding Path=DataValue}" />
<ContentPresenter Content="{Binding Path=DataEditor}" />
</StackPanel>