Autor Beitrag
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Mi 19.03.14 21:34 
Hallo Leute,

ich möchte an eine TreeView neue Items anhängen, diese sollen natürlich gleich angezeigt werden. Das funktioniert auch soweit, nur mit einem OrderBy nicht mehr. Hier mal der Code wie es funktioniert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
private void FillTreeView()
{
    var t = MyContext.Sequences; // <-Entitäten von einem SQL-Server.

    treeViewTest.ItemsSource = t;
}

private void treeViewTest_Expanded(object sender, RoutedEventArgs e)
{
    Sequences seq = ((TreeView)sender).SelectedItem as Sequences;

    TreeViewItem tvi = ((TreeView)sender).ItemContainerGenerator.ContainerFromItem(seq) as TreeViewItem;
    
    tvi.ItemsSource = seq.SequenceData; // <-SequenceData ist ein Navigation Property
}


private void button1_Click(object sender, RoutedEventArgs e)
{
    Sequences seq = ((TreeView)sender).SelectedItem as Sequences;
    
    seq.SequenceData.Add(new SequenceData() { SequenceName = "Test123", ID = "2500", Description = "Test 888" });

    MyContext.SaveChanges();
}


Das funktioniert wie gewünscht. Wird ein neus Item angehängt, so wird es gleich angezeigt. Nur wenn ich meine SubItems sortiere funktioniert es nicht mehr.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private void treeViewTest_Expanded(object sender, RoutedEventArgs e)
{
    Sequences seq = ((TreeView)sender).SelectedItem as Sequences;

    TreeViewItem tvi = ((TreeView)sender).ItemContainerGenerator.ContainerFromItem(seq) as TreeViewItem;
    
    tvi.ItemsSource = seq.SequenceData.OrderBy(x => x.ID); // <-hier die Sortierung
}


So werden die neuen Items nicht mehr angezeigt.

Ich habe gerade keine Idee wie ich das lösen kann. Wie würdet ihr das machen? Könnt ihr mich mal bitte kurz anschieben? :-)

Moderiert von user profile iconTh69: Kommentare im Code hervorgehoben

_________________
Gruß
Christoph
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: So 23.03.14 10:35 
Hat niemand eine Idee oder Anregung?

_________________
Gruß
Christoph
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 23.03.14 12:00 
Hallo Christoph,

ich kenne mich leider mit EF und Navigation Properties nicht so aus, aber evtl. ist Order by a field which is a Navigation Property to an Entity - Linq to Entity ein Anhaltspunkt für dich.

Als Abhilfe könntest du natürlich in-memory sortieren, d.h. erst die Materialisierung durchführen:
ausblenden C#-Quelltext
1:
tvi.ItemsSource = seq.SequenceData.ToList().OrderBy(x => x.ID);					


Der Beitragstitel ist daher etwas unglücklich formuliert, denn es ist ja ein Problem mit der Verwendung vom Entity Framework (und nicht von den GUI-Controls).
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Di 25.03.14 17:32 
Sorry für die späte Antwort, vielen Dank für deine Unterstützung!

Ich habe alle möglichen Varianten versucht, vergebens. Sobald man einen Filter anwendet, funktioniert das PropertyChanged des NavigationProperty scheinbar nicht mehr.


Weitere Anregungen sind natürlich Herzlich Willkommen!

_________________
Gruß
Christoph
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 25.03.14 18:20 
Hallo,

das Problem ist wohl, daß die ItemsSource nun nicht mehr direkt an das NavigationProperty gebunden ist und daher auf Änderungen nicht mehr reagiert.
Du müßtest dann wohl entweder eine eigene Klasse benutzen, welche IPropertyChanged (und evtl. ICollectionChanged) implementiert und daran binden oder aber doch händisch die ItemsSource neu binden.
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Di 25.03.14 20:20 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Du müßtest dann wohl entweder eine eigene Klasse benutzen, welche IPropertyChanged (und evtl. ICollectionChanged) implementiert und daran binden oder aber doch händisch die ItemsSource neu binden.


Nur dann werden Änderungen an den Daten nicht mehr über meinen DataContext gespeichert. Ich werde morgen noch mal in diese Richtung forschen......

Vielen Dank!

_________________
Gruß
Christoph
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Di 01.04.14 07:01 
Das Problem besteht aktuell nicht mehr, da ich nicht mehr auf das NavigationProperty zugreife, sondern immer eine neue Abfrage starte mit order by. Die Items der NavigationProperty sind beim Zugriff nicht aktuell, daher musste eine neue Abfrage in der Expandet Methode her und das Problem war somit behoben.

_________________
Gruß
Christoph