1

我为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最初填充和显示时,一切正常且符合预期。现在,如果我尝试滚动网格,则会发生以下异常:

指定元素已经是另一个元素的逻辑子元素。先断开它。

此异常与网格的行虚拟化和绑定ContentDataEditor内部单元格模板有关。如果我关闭行虚拟化,一切正常,但网格性能变得非常糟糕,所以它不是一个选项。

您是否知道DataGrid虚拟化在幕后工作,加载/卸载行时会发生什么以及可能导致此错误的原因是什么?有什么解决方法吗?

注意:我不能ContentTemplate在单元格模板中使用绑定单元格数据编辑器(在许多地方都建议作为解决方法),因为我必须手动创建和初始化这个单元格编辑器。

4

1 回答 1

0

解决了。

当结合ContentControl使用绑定和虚拟化时,这显然是一个错误。ContentDataGrid

一旦我切换到ContentPresenter一切正常工作。

工作单元模板是:

<StackPanel>
    <TextBlock Text="{Binding Path=DataValue}" />
    <ContentPresenter Content="{Binding Path=DataEditor}" />
</StackPanel>
于 2012-06-23T09:42:58.663 回答