繁体   English   中英

WPF DataGrid,模板列和虚拟化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM