Passa alla relazione Parent Children in C #

2

Usando C # e WPF ho una situazione in cui i miei dati sono organizzati gerarchicamente. Sto usando una treeview per rappresentare questo:

  • Group_01
    • Object_01
      • Material_01
        • Struttura
      • Material_02
        • Texture_02
  • Group_02
    • Object_02
      • Material_03
        • Texture_03

Mi piacerebbe essere in grado di cambiare l'ordine della gerarchia, ad esempio essere in grado di creare i dati a partire dai Materiali e conoscere tutti gli oggetti che usano quel particolare materiale

  • Material_02
    • Object_01
      • Group_01
    • Object_02
      • Group_02

Qual è la struttura dati consigliata per organizzare i dati? E come posso passare facilmente da una di queste visualizzazioni?

    
posta powernemo 16.09.2013 - 15:13
fonte

3 risposte

3

Per poterlo fare, dovrai modificare le classi del tipo di dati in modo che la classe Material abbia una raccolta di tipo Object e la tua classe Object (che è veramente pessimo nome se questa è una classe personalizzata) dovrebbe avere una raccolta di tipo Group . Anche la classe Object richiederà una raccolta di tipo Material e la classe Material richiederà anche una raccolta di tipo Texture , ecc.

Quindi dovresti progettare una funzione (con carichi di Linq o cicli) che inverta la gerarchia. Il modo più semplice per farlo è se aggiungi proprietà nelle classi del tipo di dati che si correlano tra loro. Pertanto, dovrebbero tutti avere un qualche tipo di proprietà Id e quindi le classi figlio rilevanti dovrebbero avere proprietà ParentId .

Con questa configurazione, puoi facilmente costruire le tue gerarchie:

Material material = new Material();
material.Id = theIdValue;
material.Textures = new ObservableCollection(allTextTures.Where(t => t.ParentId == 
material.Id).ToList());
    
risposta data 16.09.2013 - 15:40
fonte
2

Dato che qui ci sono molte o più relazioni, ad esempio il gruppo può avere una lista di oggetti che può avere l'elenco dei materiali e l'elenco dei gruppi a cui appartiene ... in modo simile il materiale può avere un elenco di oggetti .. quindi i tuoi modelli dovrebbero essere come sotto:

    public class Group
    {
        ObservableCollection<Object> Objects { get; set; }
    }

    public class Object
    {
        ObservableCollection<Material> Materials { get; set; }
        ObservableCollection<Group> Groups { get; set; }
    }

    public class Material
    {
        ObservableCollection<Object> Objects { get; set; }
    }

Ora per mostrare i dati gerarchici è possibile utilizzare TreeView per rappresentarlo e definire HierarchicalDataTemplates a seconda del numero di visualizzazioni, ad es. per GroupHierarchy e MateraialHierarchy è possibile avere template come:

Gerarchia di gruppo:

<HierarchicalDataTemplate x:Key="GroupTemplate" ItemsSource="{Binding Objects}">
            <StackPanel>
                <TextBlock Text="{Binding GroupName}"/>
            </StackPanel>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Materials}">
                    <TextBlock Text="{Binding ObjectName}"/>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding MaterialName}"/>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>

Gerarchia dei materiali:

<HierarchicalDataTemplate x:Key="MaterialTemplate" ItemsSource="{Binding Objects}">
            <StackPanel>
                <TextBlock Text="{Binding MaterialName}"/>
            </StackPanel>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Groups}">
                    <TextBlock Text="{Binding ObjectName}"/>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding GroupName}"/>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>

Ora puoi utilizzare ItemTemplateSelector per restituire il modello corretto per TreeView quando cambi il ItemsSource di TreeView

    
risposta data 16.09.2013 - 15:40
fonte
0

Mi concentrerei su ciò che ciascun oggetto è senza concentrarsi su come verrà visualizzato. Cos'è un nodo? Guardando la tua vista ad albero, sembra che un nodo sia un oggetto con varie proprietà: un sistema di filtraggio basato su numerose categorie potrebbe funzionare meglio di una treeview?

Quindi un utente potrebbe dire che voglio "materiale x" con "trama y" ma solo in "gruppo b" senza dover navigare attraverso una gerarchia?

È difficile dare consigli concreti senza sapere cosa rappresenta un effettivamente . Inoltre, potrebbe essere utile consultare ux.stackexchange.com per idee di visualizzazione front-end.

    
risposta data 16.09.2013 - 16:02
fonte

Leggi altre domande sui tag