WPF datagrid — гибкая привязка заголовков групп

У меня есть сетка данных wpf со сгруппированными строками, реализованная с использованием файла CollectionViewSource. Похоже, что шаблоны заголовков групп связываются напрямую с CollectionViewGroup объектами, но по какой-то причине они не очень доступны внутри CVS. Вы даете CollectionViewSource имена групп, и он обрабатывает генерацию CVG за кулисами. Это усложняет задачу, если вы хотите, чтобы стили заголовка группы были привязаны к чему-то другому, кроме тех немногих свойств, которые предоставляет CVG, таких как Name и ItemCount.

По сути, я хочу, чтобы каждая группа имела свойство Status, возможно, для визуального обозначения цветом фона заголовка группы. Это Status может измениться, поэтому заголовок каким-то образом должен будет обнаруживать propertychanged уведомления. Но так как CollectionViewGroup не имеет свойства Status, и я не могу предоставить свои собственные CVG для CollectionViewSource, я понятия не имею, как выполнить эту простую задачу.


person Tekito    schedule 25.07.2013    source источник


Ответы (1)


Я понял это в конце концов. Свойство Name для CollectionViewGroup является объектом, поэтому вы можете создать модель группового представления желаемых свойств, а затем указать ее как Name при добавлении описания группы в CollectionViewSource. А затем в xaml просто выполните вложенную привязку к Name.whatever для элементов управления заголовком группы.

Я настроил это так (vb.net, чтобы следовать):

  Me.BindedCV = New Data.CollectionViewSource
  Me.BindedCV.GroupDescriptions.Add(New Data.PropertyGroupDescription("ProductGroup"))

Это означает, что все строки (точнее, модели представления, к которым привязаны строки) будут сгруппированы в соответствии со свойством, называемым ProductGroup. Теперь я добавляю свои собственные групповые объекты в описания групп CollectionView:

        Dim pg = New ProductGroupVM(pd.Index)
        Me._ProductGroupVMs.Add(pg)
        Me.BindedCV.GroupDescriptions(0).GroupNames.Add(pg)

Таким образом, добавление pg в коллекцию GroupNames означает, что теперь на него можно ссылаться и привязывать в стиле заголовка группы xaml — это объект Name. Обратите внимание, что я также добавил pg во вторую созданную мной частную коллекцию под названием _ProductGroupVMs. Это немного хакерски, но таким образом я могу сохранить ссылку на все мои групповые объекты — когда я создаю модели представления строк, они будут иметь свойство ProductGroup, а ProductGroup должен указывать вправо pg, чтобы их можно было сгруппировать. правильно. Могут быть более чистые способы сделать это, но я пошел по этому пути.

person Tekito    schedule 30.07.2013
comment
Текито, было бы исключением получить от тебя небольшой пример, поскольку вчера я пытался разобраться в этом. Я предполагаю, что мой главный вопрос заключается в том, как вы сообщаете CollectionViewSource, какое свойство объекта «Имя» использовать для группировки? - person dansan; 28.08.2013
comment
@dansan Хорошо, я добавил немного кода. Но мой CVS не группируется по свойству Name — он группируется по ссылке на сами объекты Name. Все привязанные объекты строк имеют свойство ProductGroup, указывающее на объект Name, которому они принадлежат. - person Tekito; 30.08.2013