Группировка дочерних объектов в WPF TreeView

Я пытаюсь заставить свой структурный вид группировать набор подобных объектов тем, каковы они. Для хранения вещей универсальными моя иерархия объектов могла быть похожей на это:

  • Объекты
    • Группа объектов № 1
      • Объект № 1 (Тип)
      • Объект № 2 (Тип)
      • Объект № 3 (Тип 'B')
      • Объект № 4 (Тип 'B')

Прямо сейчас мой TreeView показывает эти объекты точно как объектная модель, но что я хотел бы сделать, вставка узел TreeView для каждого типа объекта так, чтобы он был бы похож на это:

  • Объекты
    • Группа объектов № 1
      • Тип A
        • Объект № 1
        • Объект № 2
      • Тип B
        • Объект № 3
        • Объект № 4

Я видел в подобном вопросе здесь, что кто-то рекомендовал иметь два отдельных HierarchicalDataTemplates таким образом, я создал один для 'Группы объектов № 1' уровень, который содержит TreeView со списком типов, но это действительно неуклюже, так как это - целый отдельный TreeView в некоторых узлах. Я также пытался использовать a CollectionViewSource для отфильтровывания объектов в каждой категории но это не делает меня особая польза, так как я не могу выяснить, как отобразить их.

Я предполагаю, что мой вопрос сводится к этому: Как я делаю a HierarchicalDataTemplate группа это - дети? Если бы кто-то мог бы указать на меня в правильном направлении, я ценил бы его много.

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

7
задан Naser Asadi 14 January 2013 в 21:08
поделиться

3 ответа

No. Боюсь, что нет.

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

-121--4435061-

Вы можете использовать этот тестовый код и сравнить результаты! Дио!

#include <vector> 
#include <iostream> 
#include <ctime> 
using namespace std;; 


struct AAA{
    int n;
    string str;
};
int main() { 
    const int BIG = 5000000; 
    vector <AAA> v; 
    for ( int i = 0; i < BIG; i++ ) { 
        AAA a = {i, "aaa"};
        v.push_back( a ); 
    } 

    clock_t now;
    cout << "start" << endl; 
    int n = 0; 
    now = clock(); 
    for(vector<AAA>::iterator it = v.begin(); it != v.end(); ++it) { 
        n += it->n; 
    } 
   cout << clock() - now << endl; 

    n = 0;
    now = clock(); 
    for(size_t i = 0; i < v.size(); ++i) { 
        n += v[i].n; 
    } 
    cout << clock() - now << endl; 

    getchar();
    return n != 0; 
} 
-121--998075-

Посмотрите на эту статью г-на Суми. Уверен, это вам поможет.

5
ответ дан 6 December 2019 в 21:13
поделиться

AFAIK, HierarchicalDataTemplate не может сгруппировать свои дочерние элементы.

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

И представление просто получит что-то вроде:

public interface ITreeNode
{
    string Title;
    IList<ITreeNode> ChildNodes;  
}

и отобразите его с помощью HierarchicalDataTemplate .

0
ответ дан 6 December 2019 в 21:13
поделиться

Вы можете достичь этого эффекта, привязав ItemsSource к вашему HierarchicalDataTempalate с помощью IValueConverter ]. Этот конвертер просто выполняет следующие действия:

public class MyConverter : IValueConverter
{
  public object Convert(object value, ...)
  {
    return
      from item in (IEnumerable<MyItem>)value
      group item by item.Type into g
      select new { Type = g.Key, Items = g }
  }
  ...
}

Теперь ваш HierarchcialDataTemplate может иметь следующий вид:

<HierarchicalDataTemplate ItemsSource="{Binding SomePath, Converter={x:Static local:MyConverter}">

  <HierarchicalDataTemplate.ItemTemplate>
    <HierarchicalDataTemplate
      ItemsSource="{Binding Items}"
      TargetType="{x:Type local:MyItem}"

      ItemTemplate="{StaticResource MyItemTemplate}">
         <!-- may omit ItemTemplate in prior line to use implicit template -->

      <TextBlock Text="{Binding Type}" /> <!-- Header for type -->

    </HierarchicalDataTemplate>
  </HierarchicalDataTemplate.ItemTemplate>

  <!-- header for "Object Group #1" -->

</HierarchicalDataTemplate>
7
ответ дан 6 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: