WPF DataGrid с иерархией типов TreeView - PullRequest
1 голос
/ 12 октября 2011

Возможно ли иметь чисто иерархическую сетку данных wpf? Теперь есть 3 возможных решения по Интернету ...

  1. GroupStyle
  2. TreeListView вместо DataGrid
  3. RowDetailsTemplate

Теперь все 3 в моем случае бесполезны, поскольку у каждого из них есть ограничения.

GroupStyle предоставляет сгруппированных презентаторов строк, но их родитель просто GroupItem. Это где мой источник данных отличается. В моем случае родительский элемент сгруппированных элементов будет принадлежать к тому же типу элемента.

например. Folder класс имеет List<Folders> children. Таким образом, родительский элемент дочерних папок имеет тип Folder.

RowDetailsTemplate потребуется, чтобы я разместил другую сетку данных, связанную с Children, но это означало бы, что он будет иметь свои собственные заголовки столбцов, и я хочу, чтобы дочерние элементы разделяли того же столбца представление родительской DataGrid, как в TreeListView.

А для TreeListView это то, что я сейчас использую, но его проблема в ...

Это теряет виртуализацию и это не сетка данных

: -)

Я думал, как какое-то связанное поведение, которое переключает представление иерархии для сетки данных, например ...

  <DataGrid HierarchicalBehavior.HierarchyPath="Children" ... />

Где Children - свойство типа IEnumerable для каждого элемента.

Надеюсь, вы, ребята, понимаете, к чему я клоню.

Есть идеи?

1 Ответ

2 голосов
/ 09 февраля 2012

Я мог бы наконец реализовать это. Код слишком велик для публикации. Но если кто-то ищет решение, отправьте мне электронное письмо.

В основном я сделал следующие вещи ...

  1. Я использовал быстрое выравнивание иерархии предметов в плоский список.
  2. Каждый элемент, связанный с сеткой данных WPF, которую я реализовал INotifyPropertyChanged, а также следующие дополнительные свойства через базовый класс.

Parent => Родительский элемент, для которого этот элемент является дочерним. Readonly.

HasHierarchy => False, когда дочерние элементы иерархии равны нулю или пусты. Writeable.

IsItemVisible => Текущая видимость. Writeable.

IsBranchVisible => False, если какой-либо предок имеет IsExpanded = false или IsItemVisible = false. Только для чтения, но для уведомления.

IsExpanded => Если элемент расширен. Writeable.

3. I put a PLINQ call to filter the `IsBranchVisible` property as true, of all children whenever any descenden's `IsExpanded` property is **toggled**.

Voala! Это работает как шарм. Быстро благодаря PLINQ.

...