Laden...

HierarchicalDataTemplate und static Notes

Erstellt von MysticEmpires vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.754 Views
M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 10 Jahren
HierarchicalDataTemplate und static Notes

Hi,

ich habe hier ein TreeView:


<TreeView>
    <TreeViewItem Header="General" Tag="Forms.General" />
    <TreeViewItem Header="Connections" ItemsSource="{Binding Connections}" />
</TreeView>

So sieht mein HierarchicalDataTemplate dazu aus


<HierarchicalDataTemplate DataType="{x:Type classes:Connection}">
    <TextBlock Text="{Binding DisplayName}" />
</HierarchicalDataTemplate>

Das funktioniert wunderbar. Jetzt das Problem. Ich hätte gern unter jeder Note zwei feste Notes. Die nicht auf Eigenschaften oder so basieren.

Das heißt im Prinzip soll es so aussehen das ich ne "General"-Note habe ohne Childs. Dann halt eine "Connections"-Note. Diese hat aber x "Connection"-Notes. Und jeder dieser "Connection"-Notes soll halt einfach zwei feste Childs bekommen.

Gruß
Mystic

R
212 Beiträge seit 2012
vor 10 Jahren

Öhm, wenn ich dass jetz richtig verstandenb habe möchtest du das deine ""Connection"-Notes""
immer 2 Feste Child item haben.

Wenn du unterschiedliche Klassen zur darstellung verwendest, leg das doch einfach im Konstuktor fest.


public Connection()
{
   Connections.Add(new Connection(....));
   Connections.Add(new Connection(....));
}

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 10 Jahren

Nicht ganz. Ganz simple eigentlich. Ich habe einen "Connection" Klasse. Diese beinhaltet ein paar Eigenschaften. Dann gibt es einen ObservableCollection die hält alle Connection-Klassen. Diese ist im Beispiel an das ListViewItem gebunden.

Dadurch entsteht jetzt ein Note mit jeweils einer Childnote für eine Verbindung. Soweit auch alles super.

Jetzt würde ich unter jeder Verbindung einfach gerne zwei Childnotes anlegen z.b "Childnote1", "Childnote2". Das quasi jeder Verbindung einfach zwei fest, unabhängig vor der Klasse, zwei Childnotes bekommt. Diese sollen später für die Bedienung da sein.

R
212 Beiträge seit 2012
vor 10 Jahren

musste per hand machen, oder wenn du von einer basisklasse erbst diese in der basisklasse festlegen

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 10 Jahren

Das muss doch irgend wie über XAML gehen.

Wie gesagt und die Child-Notes habe nichts mit der Klasse zutun. Sie dienen nur zur besseren Navigation.

5.299 Beiträge seit 2008
vor 10 Jahren

nein, im xaml macht man das wohl grad nicht.
bau dir halt das Viewmodel, wie dus im Treeview haben möchtest. Und wenn bestimmte Nodes genau 2 Childs haben sollen, dann muss das entsprechende Objekt im ViewModel halt genau 2 Childs haben.

Der frühe Apfel fängt den Wurm.

3.511 Beiträge seit 2005
vor 10 Jahren

Schau dir mal die CompositeCollections an. Sowas geht in Xaml, aber der bessere Weg ist es, über das ViewModel die zusätzlichen Nodes anzuhängen.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 10 Jahren

Ich habe in dem Fall kein kein ViewModel. Wäre bei dem Projekt bissel overkill. Ich habe noch andere Notes in der TreeView die sind alle Static. Wenn das nicht so wäre hätte ich mir wohl auch ein ViewModel gebaut.

Mir möchte es irgend wie nicht in den Kopf das es nicht irgend wie möglich einfach über XAML im HierarchicalDataTemplate einfach noch die zwei statisches Notes zu definieren 😕

R
212 Beiträge seit 2012
vor 10 Jahren

Du könntest natürlich auch das Template überschreiben, und jedem Item erst 2 ChildItems anhängen und dann den kontext, das wäre aber sehr statisch, dh. Du könntest die eigenschaften des Items nur da festlegen.

5.299 Beiträge seit 2008
vor 10 Jahren

hmm.
ich finde auch bei kleinen Anwendungen den MVVM-Pattern nicht Overkill.

paar Samples (sind doch klein, oder?)
WpfFramesetLike
LookupConverter
ViewmodelLocator-Pattern

Der frühe Apfel fängt den Wurm.

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 10 Jahren

Ok du hast mich überzeugt dann baue ich ein View-Model für die Seite 😃. Ich weiß nur noch nicht genau wie 😕

Im Prinzip habe ich einen Klasse die aus einer XML-Daten zieht. Diese haben ich zwar in Klassen aufgeteilt jedoch decken diese sich nicht direkt mit der UI sondern eher nach dem logischen Aufbau der Daten.

Daher habe ich die TreeView halt recht statisch gebaut. Und nur da wo ich Childs auf Basis einer Liste aufbauen muss habe ich das Binding benutzt. Das funktioniert ja auch wunderbar. NUr möchte ich halt ungern meine Logische Klasse um UI Elemente erweitern.

Eigenes "TabControl" mit TreeView erstellen, kompatibel mit Visual Studio Designer

Geht schon grob in die Richtung. Ich habe auch ein ContentPresenter der auf SelectedItem reagiert. Da ich wie gesagt keine Klassen dafür habe benutze ich die Tag Eigenschafte des Items dort steht dann so was drin wie "Forms.FormName" ein Converter wandelt das dann in das UserControl mit dem namen "FormName" um es wird dadurch angezeigt.

Jetzt im Nachhinein ließt sich das echt etwas dreckig. Nur wie müsste ich den ein ViewModel für einen TreeView aufbauen wenn die kaum auf Klassen passiert sondern statisch ist und nur ab und an ne Klasse als Basis hat?

5.658 Beiträge seit 2006
vor 10 Jahren

Hi MysticEmpires,

dein Beitrag klingt nicht danach, als hättest du dich mal zum Thema MVVM belesen.

Da ich wie gesagt keine Klassen dafür habe benutze ich die Tag Eigenschafte des Items dort steht dann so was drin wie "Forms.FormName" ein Converter wandelt das dann in das UserControl mit dem namen "FormName" um es wird dadurch angezeigt.

Das hat nichts damit zu tun, worum es bei MVVM geht. Das ViewModel sollte genau solche "Konstruktionen" ersetzen.

Jetzt im Nachhinein ließt sich das echt etwas dreckig. Nur wie müsste ich den ein ViewModel für einen TreeView aufbauen wenn die kaum auf Klassen passiert sondern statisch ist und nur ab und an ne Klasse als Basis hat?

Was für Klassen passieren bei dir?

Scheint sich aber spätestens hier um Grundlagen zu handeln. Bitte beachte [Hinweis] Wie poste ich richtig?. Wir setzen voraus, daß du weißt, was eine Klasse ist, was statisch bedeuted und was ein ViewModel ist. Dazu gibt es genügend Artikel in der Doku und im Netz!

Christian

Weeks of programming can save you hours of planning

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 10 Jahren

Mir ist schon bewusst was MVVM ist. Geschweige denn was Klassen sind und was statisch bedeutet...

Ich hatte ja oben auch schon erwähnt das ich kein ViewModel gemacht hatte weil ich es in dem Fall (da kleines Projekt) nicht in Betracht gezogen hatte. Was auch der Grund ist wieso so einen "Konstruktionen" entstanden ist. Das, dass im Endeffekt ein Falsche Entscheidung war sei mal dahingestellt.

Und "passiert" sollte "basiert" heißen. Ist aber glaube ich der Rechtschreibkorrektur von FireFox zum Opfer gefallen.

Das einzige was ich eben gefragt hatte war wie ich am besten ein ViewModel für die TreeView zusammenbaue, welches einen festen Aufbau (was übrigens das was was ich mit statisch meinte...) hat und wo nur einige Knoten auf Klassen basieren, erstelle.

5.658 Beiträge seit 2006
vor 10 Jahren

Kann es sein, daß wir aneinander vorbeireden? Wenn du ein statische (also unveränderliche) Auflistung von Knoten hast, brauchst du weder ViewModel noch irgendwelchen Code, sondern kannst die Knoten in XAML deklarieren. So wie ich deine Frage verstanden habe, willst du aber statische Knoten und dynamisch erstellte Knoten in einem TreeView anzeigen. Dafür brauchst du ein ViewModel.

Wie dem auch sei, inzwischen sollten alle Fragen dazu beantwortet sein. Wie man Auflistungen erstellt und wie man Elemente hinzufügt, sollte bekannt sein und ist kein Thema für das Forum sondern für die Doku.

Christian

Weeks of programming can save you hours of planning

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 10 Jahren

Richtig. Ich habe ne statische (also unveränderliche) Auflistung von Knoten. Diese habe ich auch komplett in XAML deklariert. Einer dieser Knoten sollte aber auf Basis einer Auflistung Childs bekommen. Was auch alles noch wunderbar in XAML und ohne ViewModel funktioniert hat. Nun sollte genau jeder dieser dynamisch erstellen Knoten zwei feste knoten bekommen. Wo ich dann wie gesagt an an Grenze gestoßen bin.

Was auch der Grund meiner Frage hier im Forum war.

Und was bitte sollen solche Aussagen wie "Wie man Auflistungen erstellt und wie man Elemente hinzufügt, sollte bekannt sein und ist kein Thema für das Forum sondern für die Doku." eigentlich? Ich habe nach nichts der gleichen gefragt.

H
114 Beiträge seit 2007
vor 10 Jahren

Hallo MysticEmpires,

ich würde an dieser Stelle auf die Definition von Knoten im XAML verzichten, auch wenn ein Teil statisch ist. Wenn du es komplett in MVVM umsetzt, dann definierst du einfach ein ViewModel für einen Knoten im Baum und organisierst diese in einer Hierarchie. Das heißt jedes NodeViewModel hat wiederum eine Auflistung von NodeViewModels.
Alle statischen Knoten legst nun einfach einmalig im Code beim Erzeugen des ViewModels für den TreeView an und alle dynamischen eben zu dem Zeitpunkt, wo du die Daten zu diesen liest. Und jeder dynamische Knoten bzw. deren ViewModel erstellt dann einfach bei der Erzeugung wiederum die fix benötigten Knoten.
Dann hast du alle notwendigen Knoten, egal of fix oder dynamisch, in einer Datenstruktur und kannst das nach belieben Erweitern, Umsortieren, Knoten entfernen oder was auch immer eine zukünftige Anforderung sein könnte 😉

Grüße, HiGHteK

3.511 Beiträge seit 2005
vor 10 Jahren

Den Hinweis auf die CompositeCollection bist du scheinbar auch noch nicht gefolgt. Denn genau mit dem Ding kannst du im Xaml statische Elemente erzeugen und mit dynamischen Listen verknütten. Ob jetzt Liste, oder Tree ist total egal, ist eh alles das Gleiche...

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 10 Jahren

Den Hinweis auf die CompositeCollection bist du scheinbar auch noch nicht gefolgt. Denn genau mit dem Ding kannst du im Xaml statische Elemente erzeugen und mit dynamischen Listen verknütten. Ob jetzt Liste, oder Tree ist total egal, ist eh alles das Gleiche...

Leider nicht da eine CompositeCollection nicht in einem HierarchialDataTemplate benutzt werden kann.

Hier hat ein das selbe Problem gehabt wie ich:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/b61a8bc9-ebae-4b9a-a7e6-c6849641f7cc/static-treeviewitems-in-a-bound-treeviewitem?forum=wpf

Er hat zwar an den Objecten jeweil noch Items gebunden. Das könnte man in meinen Fall aber weglassen. Nur leider ist seine Seite down :'(

3.511 Beiträge seit 2005
vor 10 Jahren

Oh. Sorry, das habe ich jetzt so nicht gewusst.

Aber was gehen sollte wäre ein IValueConverter, der dann an das ItemsSource des Templates gebunden wird. Der ValueConverter gibt dann eine CompositeCollection zurück. Aber dann bist du wieder raus aus Xaml.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

5.658 Beiträge seit 2006
vor 10 Jahren

Alles, was man braucht ist eine ObservableCollection für jeden Knoten mit allen statisch und dynamisch generierten Unterknoten. Mehr braucht es nicht. Ich verstehe das eigentliche Problem einfach nicht. 🤔

Weeks of programming can save you hours of planning

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 10 Jahren

War ansich ganz einfach:

Hier die Liste:


        <!-- Liste der ChildNotes-->
        <collections:ArrayList x:Key="ConnectionChilds">
            <classes:TreeItemObject ItemsSourcePath="Child1" />
            <classes:TreeItemObject ItemsSourcePath="Child2" />
            <classes:TreeItemObject ItemsSourcePath="Child3" />
        </collections:ArrayList>

Hier da Template für die Anzeige:


        <!-- Template für Connections-Childs-->
        <DataTemplate DataType="{x:Type classes:TreeItemObject}">
            <TextBlock Margin="5,0" Text="{Binding Path=ItemsSourcePath}"/>
        </DataTemplate>


        <!-- Template für Connections-Note -->
        <HierarchicalDataTemplate DataType="{x:Type classes:Connection}" ItemsSource="{Binding Source={StaticResource ConnectionChilds}}" >
            <TextBlock Text="{Binding DisplayName}" />
        </HierarchicalDataTemplate>

TreeItemObject sieht so aus:

   public class TreeItemObject
    {
        public string ItemsSourcePath { get; set; }
    }

Jetzt habe ich wunderbar 3 Childs unter meinen Verbindungen. Wenn ich jetzt noch hin bekommen würde das ich das DataContex vom Parent (also die Connection) auf die Childs (meine erzeugen Notes) bekommen würde wäre ich überglücklich ^^. Da das TreeView leider nur das Object liefert bei SelectedItem, das TreeViewItem wäre mir leiber 😕

Im DataTemplate kann ich wunderbar so auf den DataContex zugreifen:

<TextBlock Margin="5,0" Text="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorLevel=2, AncestorType=TreeViewItem}}"/>

Nur brauch ich es quasi auf dem TreeItemObject.