2012-06-23 11 views
1

Я создал классы VM для DataGrid элементов (строки и ячейки). Класс VM для Cell показано ниже:WPF DataGrid, столбец шаблонов и виртуализация

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 первоначально заполнена и показано на рисунке. Теперь, если я пытаюсь SCROLL сетки следующее исключение происходит:

указанный элемент уже является логическим дочерним элементом другого элемента. Отсоедините его первым.

Это исключение имеет что-то делать с виртуализацией строке сетки и привязки Content к DataEditor внутри шаблона клеток. Если я отключу виртуализацию строк, все будет хорошо, но производительность сетки станет очень плохой, поэтому это не вариант.

Знаете ли вы, что виртуализация работает за кулисами, что происходит, когда строка загружается/выгружается и что может быть причиной этой ошибки? Есть ли обходные пути?

Примечание: я не могу использовать привязку ContentTemplate для редактора данных ячейки в шаблоне ячейки (что рекомендуется во многих местах в качестве обходного пути), потому что я ДОЛЖЕН вручную создать и инициализировать этот редактор ячеек.

ответ

0

Решено.

Это, очевидно, ошибка где-то в ContentControl при использовании связи Content в сочетании с DataGrid виртуализацией.

Как только я переключился на ContentPresenter, все работает безупречно.

Работа шаблон ячейки:

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

Возможно, эта ошибка все еще существует в Windows Store XAML, но без ошибок, см https://connect.microsoft.com/VisualStudio/feedback/details/797231/content- выплавляемый ContentControl переплета к UserControl-внутри-виртуализация-StackPanel # Вкладка –

Смежные вопросы