[英]WPF DataGrid, Template Column and Virtualization
我已经为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
绑定(建议在许多地方作为解决方法),因为我必须手动创建和初始化此单元格编辑器。
解决了。
将Content
绑定与DataGrid
虚拟化结合使用时,这显然是ContentControl
一个错误。
一旦我切换到ContentPresenter
一切都会正常运行。
工作单元模板为:
<StackPanel>
<TextBlock Text="{Binding Path=DataValue}" />
<ContentPresenter Content="{Binding Path=DataEditor}" />
</StackPanel>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.