Я создал классы 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
для редактора данных ячейки в шаблоне ячейки (что рекомендуется во многих местах в качестве обходного пути), потому что я ДОЛЖЕН вручную создать и инициализировать этот редактор ячеек.
Возможно, эта ошибка все еще существует в Windows Store XAML, но без ошибок, см https://connect.microsoft.com/VisualStudio/feedback/details/797231/content- выплавляемый ContentControl переплета к UserControl-внутри-виртуализация-StackPanel # Вкладка –