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
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
**:::
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.
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"
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 😦
**:::
[...]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"
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
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.
MVVM möchte ich gerne gaaaanz weit abseits lassen 😃
Mit der Einstellung kommste bei WPF nicht arg weit.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code