Laden...

Treeview mit variabler Levelanzahl

Erstellt von Phrixotrichus vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.170 Views
P
Phrixotrichus Themenstarter:in
11 Beiträge seit 2011
vor 10 Jahren
Treeview mit variabler Levelanzahl

Servus allerseits,

Ich brauche ein "wenig" Hilfe bei einer dynamischen WPF Treeview für 3 Level

Top -> Mid -> Bot

Bisher habe ich ein sql-bestücktes Dataset für Top -> Mid, das ich mit einer Master-Slave-Relation versehen habe mit welcher ich via HierarchicalDataTemplate und Databinding meine Treeview nefüllt habe. Jede Ebene hat ihre eigene Tabelle die ich je nach "selected" Tree Item befülle.

Nun soll noch eine "bot" Ebene dazu kommen.

Mein Problem ist jetzt, daß es durchaus sein kann, daß es keine "mid" ebene gibt und stattdessen "Top -> Bot" gillt.

Wie kriege ich solche "dynamischen" Verhältnisse zu Stande? Am besten unter Verwendung von Databinding, falls möglich.

Vielen Dank schon einmal für eure Antworten 😃

mfg,
Phrix

1.696 Beiträge seit 2006
vor 10 Jahren

Nun soll noch eine "bot" Ebene dazu kommen.

Mein Problem ist jetzt, daß es durchaus sein kann, daß es keine "mid" ebene gibt und stattdessen "Top -> Bot" gillt.

Hallo,

wenn es kein Mid gibt, dann ist Top - Mid = Top - Bot, denn Bot kann ja nicht in der Luft hängen, dann ist ja alles beim alten, wo ist das Problem? Oder habe ich was nicht verstanden?

Grüße

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

P
Phrixotrichus Themenstarter:in
11 Beiträge seit 2011
vor 10 Jahren

Nun soll noch eine "bot" Ebene dazu kommen.

Mein Problem ist jetzt, daß es durchaus sein kann, daß es keine "mid" ebene gibt und stattdessen "Top -> Bot" gillt.

Hallo,

wenn es kein Mid gibt, dann ist Top - Mid = Top - Bot, denn Bot kann ja nicht in der Luft hängen, dann ist ja alles beim alten, wo ist das Problem? Oder habe ich was nicht verstanden?

Grüße Das sind aber unterschiedliche Datensätze, wie kann ich sowas dem treeview DYNAMISCH als datanbinding-source vorgeben? Ob etwas
Top->mid->bot oder top->bot ist muss ja in echtzeit bei jedem einzelnen Knoten überprüft werden, je nachdem was angewählt wird.
Im endeffekt wie im Windows dateibrowser wo auch erst beim öffnen geschaut wird was es an Unterpunkten eigentlich gibt.
Das will ich hinbekommen.

P
660 Beiträge seit 2008
vor 10 Jahren

ich verstehe irgendwie immer noch nicht wo dein problem ist! O.o

du hast eine Klasse Top, diese hat eine Liste der Klasse Mid, diese wiederrum eine Liste von Bot.

Soweit richtig?

Irgendetwas müssen diese Klassen doch gemeinsam haben, und genau das kannst du als BasisKlasse
definieren und deine Top Klasse so ändern, dass es statt Mid Objekten auch Objekte vom Typ der
BasisKlasse aufnehmen kann.

Zusätzlich bastelst du dir einen ItemTemplateSelector und kannst dort prüfen welchen Typ du in der
Liste von Top hast, und das Template entsprechend anpassen.

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

P
Phrixotrichus Themenstarter:in
11 Beiträge seit 2011
vor 10 Jahren

ich verstehe irgendwie immer noch nicht wo dein problem ist! O.o

du hast eine Klasse Top, diese hat eine Liste der Klasse Mid, diese wiederrum eine Liste von Bot.

Soweit richtig? Nein, ich habe ein Dataset mit eine Tabelle für jede Ebene, beziehungsweise bisher habe ich ein Dataset mit zwei Tabellen die via Master-Slave Relation verknüpft sind, welche wiederum via Databinding die Treeview versorgt. Das ganze bezieht seine Daten aus einer SQL Datenbank und kann vom Nutzer über die GUI jederzeit editiert und aktualisiert werden.
Für 3 Ebenen klappt das mit Relations ja nun nichtmehr, zumindest nicht wenn es eben nicht immer für jeden Wurzelknoten fix 3 Ebenen sind, oder doch?
Und wie das ganze dann "binden"?

Irgendetwas müssen diese Klassen doch gemeinsam haben, und genau das kannst du als BasisKlasse
definieren und deine Top Klasse so ändern, dass es statt Mid Objekten auch Objekte vom Typ der
BasisKlasse aufnehmen kann.

Zusätzlich bastelst du dir einen ItemTemplateSelector und kannst dort prüfen welchen Typ du in der
Liste von Top hast, und das Template entsprechend anpassen. Hast du dafür zufällig ein Beispiel. Ich hab gerade nicht so eine konkrete Vorstellung davon wie ich das dann "binden" soll. ich müsste ja zur laufzeit jedes mal wenn ein Knoten angewählt wird die liste des entsprechenden Nodes neu erstellen und dem Programm mitteilen welches Template verwendet werden soll.
WIe sieht das im XML code aus?

Tut mir Leid wenn ich hier so gar keinen Durchblick habe, mit C# habe ich davor noch nie zu tun gehabt 😦

1.696 Beiträge seit 2006
vor 10 Jahren

Hallo,

schaust du mal dieses Beispiel an: Data Binding Treeview da Bsp für Winform

Grüße

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

P
660 Beiträge seit 2008
vor 10 Jahren

[...]Soweit richtig?
Nein

ach, verdammt XD

aber hier mal ein gutes Tutorial wegen dem DataTemplateSelector

wpf tutorial: how to use a datatemplateselector

kurz gesagt: Du fragst den Typ ab und returnst das entsprechende Template (welches zuvor im XAML definiert und gesetzt wird)

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

5.658 Beiträge seit 2006
vor 10 Jahren

Hi Phrixotrichus,

die Frage, wie deine Daten überhaupt miteinander verknüpft sind, bleibt nach wie vor offen. Das HierachicalDataTemplate erwartet eine Auflistung von untergeordneten Knoten, egal ob es sich dabei um "Mid"- oder "Bot"-Objekte handelt. Irgendwo in deiner Datenstruktur (egal ob Objekte oder Datensätze) oder deiner Business-Logik muß doch eine Beziehung existieren, nach der die Knoten der obersten Ebene den Knoten der untersten Ebene zugeordnet werden, wenn es keine Knoten der mittleren Ebene gibt.

Letztendlich ist es Aufgabe deines ViewModels, alle Unterknoten eines Knotens aufzulisten, damit sie an das HierarchicalDataTemplate gebunden werden können. Für den Fall, daß die Beziehung vom Programm (bzw. vom ViewModel) vorgegeben wird, kann das z.B. wie folgt aussehen (Achtung: ungetestet!). Das ChildNodes-Property wird dann jeweils an das HierarchicalDataTemplate.ItemsSource-Property gebunden.


public class NodeViewModel : INotifyPropertyChanged
{

  public ObservableCollection<Mid> Mids { get; set; }
  public ObservableCollection<Bot> Bots { get; set; }

  public ICollection ChildNodes 
  {
    get { return Mids.Count == 0 ? Bots : Mids; }
  }

  public NodeViewModel()
  {
    Mids = new ObservableCollection<Mid>();
    Bots = new ObservableCollection<Bot>();
    Mids.CollectionChanged +=  (obj, e) => NotifyPropertyChanged("ChildNodes");
    Bots.CollectionChanged +=  (obj, e) => NotifyPropertyChanged("ChildNodes");
  }

  // TODO: Implement INotifyPropertyChanged
}

Christian

Weeks of programming can save you hours of planning

P
Phrixotrichus Themenstarter:in
11 Beiträge seit 2011
vor 10 Jahren

die Frage, wie deine Daten überhaupt miteinander verknüpft sind, bleibt nach wie vor offen.

Stationen (top) -> Substationen (mid) -> Peripherals (bot)

Die Peripherie kann entweder direkt auf den stationen sitzen oder eben auf Substationen.

Meine ursprüngliche Frage ist einfach, ob ich das immer noch irgendwie mit einem Dataset und Relationen per Databinding hinbekommen kann, wie ich es ursprünglich für 2 level hatte, oder ob ich hier einen ganz anderen weg einschlagen muss?

Letztendlich ist es Aufgabe deines ViewModels, alle Unterknoten eines Knotens aufzulisten, damit sie an das HierarchicalDataTemplate gebunden werden können. Für den Fall, daß die Beziehung vom Programm (bzw. vom ViewModel) vorgegeben wird, kann das z.B. wie folgt aussehen (Achtung: ungetestet!). Das ChildNodes-Property wird dann jeweils an das HierarchicalDataTemplate.ItemsSource-Property gebunden.

MVVM möchte ich gerne gaaaanz weit abseits lassen 😃

Das ChildNodes-Property wird dann jeweils an das HierarchicalDataTemplate.ItemsSource-Property gebunden.

mmmm k, so langsam verstehe ich es ein wenig.

16.827 Beiträge seit 2008
vor 10 Jahren

MVVM möchte ich gerne gaaaanz weit abseits lassen 😃

Mit der Einstellung kommste bei WPF nicht arg weit.