WPF DataGrid,模板列和虚拟化

时间:2012-06-23 08:26:31

标签: c# wpf

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

  

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

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

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

注意:我不能对单元格模板中的单元格数据编辑器使用ContentTemplate绑定(在许多地方建议使用它作为解决方法),因为我必须手动创建并初始化此单元格编辑器。 < / p>

1 个答案:

答案 0 :(得分:0)

解决。

ContentControl绑定与Content虚拟化结合使用时,这显然是DataGrid中某处的错误。

切换到ContentPresenter后,一切都完美无瑕。

工作单元格模板是:

<StackPanel>
    <TextBlock Text="{Binding Path=DataValue}" />
    <ContentPresenter Content="{Binding Path=DataEditor}" />
</StackPanel>