Autor Beitrag
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 20.05.10 20:03 
Ich benötige noch mal eine kleine Gedankenstütze. Ich möchte einen TreeView dynamisch mit Werten füllen. Weil das aber sehr viele Werte sein können, soll der Durchlauf erst mal nur den Root füllen und noch ermitteln, ob die Root-Knoten Children haben. Wenn Ja, dann soll das Kreuzchen zum Ausklappen erscheinen, aber die Unterknoten selbst werden noch gar nicht geladen. Klappt man den Knoten dann aus, werden die entsprechenden Unterknoten geladen.

Frage: Wie ging das noch mal mit dem Plus/Minus, damit es erscheint, auch wenn gar kein Unterknoten vorhanden ist.
Ich habe mich in den Eigenschaften jetzt dumm und dämlich gesucht. Aber ich finde es nicht. Ich wusste sogar mal, wie das funktioniert. Aber das ist lange her. :oops:


(PS: Ist eine Frage für den System.Windows.Forms.TreeView. Ich nehme aber auch gern Anregungen für den WPF-TreeView an.)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 20.05.10 20:36 
Wüßte nicht das man das Verhalten einfach über eine Property erreichen könnte. Eigentlich müßte man den DrawMode auf OwnerDrawAll setzen und dann Plus/Minus (und alles andere dann zwingend auch) selber zeichnen. Am einfachsten ist es aber glaube ich einen ~Dummy~Node anzuhängen (der ist eh nicht zu sehen wenn der ParentNode collapsed ist) und beim aufklappen diesen dann durch die wirklichen Nodes zu ersetzen.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 20.05.10 21:48 
user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
und noch ermitteln, ob die Root-Knoten Children haben.
Kannst du diese zweite Ebene dann nicht direkt in den TreeView laden, wenn du schon dabei bist? Das bietet sich vor allem bei asynchronen Daten an, damit man nach dem Aufklappen nicht kurz vor unvollendeten Tatsachen steht. Sollte das doch zu teuer sein, fällt mir auch nichts Anderes als ein Dummy-Node ein.

Den ersten Fall unterstützt WPF übrigens schon von Haus aus: Templates werden erst instantiiert, wenn sie zum ersten Mal sichtbar werden. Wenn dein Model also sowieso schon lazy genug ist, hast du hier das Problem in 0 Zeilen gelöst :) .

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.05.10 06:43 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Wüßte nicht das man das Verhalten einfach über eine Property erreichen könnte.

Upps. Sollte das Delphi (VCL) gewesen sein?! :nixweiss: Egal.


Mein Problem noch mal etwas ausführlicher: Ich mache eine HTTP-Anfrage an ein lokal laufendes Programm, weil ich Daten benötige. Diese Anfrage erwartet als ID die ID des jeweiligen Knotens (wenn man es als Baum betrachtet). Mit "-1" bekomme ich die Werte der Root-Ebene. Und leider nur die! Um also herauszubekommen, ob ein Root-Knoten überhaupt Unterknoten hat, muss ich also die HTTP-Anfrage mit der ID des gefundenen Knotens wiederholen. In der dritten Ebene dann wieder... und wieder... und wieder...

Wir sprechen hier übrigens über die Hilfedokumente aus dem VS 2010. Wer sich das schon mal angeguckt hat, weiß dass das Inhaltsverzeichnis sehr kurz gehalten ist. Das komplette Verzeichnis zusammenzubauen heißt also, diese Anfragen für jedes Dokument (= Knoten) zu wiederholen. Und bei großen Dokumentationen kann das ziemlich lange dauern. Deswegen wollte ich mir das ersparen und nur die Hauptebene laden und beim Aufklappen dann befüllen, usw.
Ich werde das mit dem Dummy-Node mal ausprobieren.

(Ja, das ist für mein neues Hilfe-Addin für SharpDevelop ;))
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 21.05.10 13:40 
user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
(Ja, das ist für mein neues Hilfe-Addin für SharpDevelop ;))
Akzeptieren die überhaupt noch Winforms-Code :mrgreen: ? Wenn man die Wahl hat, würde ich doch eindeutig zu WPF tendieren. Statt einen Dummy-Node einzufügen gleich die nächste Ebene (asynchron) vorzuladen, sollte doch locker im Rahmen liegen, und dann kannst du das wirklich ohne eine Zeile GUI-Code lösen :) .

Edit: Mir war langweilig :D .
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
  <TreeView ItemsSource="{Binding}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Title}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
      DataContext = new[] { new TocEntry("ms.help?method=page&id=-1&topicversion=100&topiclocale=EN-US&SQM=1&product=VS&productVersion=100&locale=EN-US") };
    }
  }

  class TocEntry : INotifyPropertyChanged
  {
    const string server = "http://127.0.0.1:47873/help/1-180/";
    WebClient client = new WebClient();
    Lazy<IEnumerable<TocEntry>> children;

    public TocEntry(string url)
    {
      url = url.Replace("product=&productVersion""product=VS&productVersion");
    
      client.DownloadStringCompleted += (_, e) =>
      {
        var root = XElement.Parse(e.Result);
        var mappings = new XmlNamespaceMappingCollection {
          new XmlNamespaceMapping("x"new Uri("http://www.w3.org/1999/xhtml"))
        };

        var hrefs = (IEnumerable)root.XPathEvaluate(
          "x:body/x:div[@class='OH_outerDiv']/x:div[@id='LeftNav']/x:div[@id='toc']/x:div[@id='toc_children']/x:div[@class='OH_selfTocLinks']/x:a/@href",
          mappings);
        children = new Lazy<IEnumerable<TocEntry>>(() =>
          hrefs.Cast<XAttribute>()
          .Select(href => new TocEntry(href.Value))
          .ToArray()
        );
        RaisePropertyChanged("Children");

        Title = root.XPathSelectElement("x:head/x:title", mappings).Value;

        client.Dispose();
      };

      client.DownloadStringAsync(new Uri(server + url));
    }

    private string title = null;
    public string Title
    {
      get { return title; }
      private set
      {
        if (title != value)
        {
          title = value;
          RaisePropertyChanged("Title");
        }
      }
    }

    public IEnumerable<TocEntry> Children { get { return children != null ? children.Value : null; } }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged(string name)
    {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null) handler(thisnew PropertyChangedEventArgs(name));
    }
  }

"Lustig" ist allerdings, dass der Library Agent bei der gleichen Query andere, nämlich falsche, Links gibt als dem Browser - deswegen die erste Zeile im Konstruktor. Liegt sicher an irgendetwas Unsinnigem wie dem User Agent, aber das überlasse ich mal dir ;) .

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.05.10 18:10 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
(Ja, das ist für mein neues Hilfe-Addin für SharpDevelop ;))
Akzeptieren die überhaupt noch Winforms-Code :mrgreen: ?

Mit gewissen Einschränkungen. Meinen Einstellungsdialog musste ich ändern. Aber ansonsten darf und kann man auch noch WinForms nutzen. btw, ich habe ein funktionierendes TOC-Pad hier liegen (s. Bild im Anhang; die Version ist aber nicht eingecheckt). Aber eben mit der "Einschränkung" (Help System-technisch bedingt), dass ich die Knoten rekursiv lade. Und das kann im schlimmsten Fall bei einem Doku-Monster wie dem WinSDK oder der VS-Doku dauern.

Zitat:
"Lustig" ist allerdings, dass der Library Agent bei der gleichen Query andere, nämlich falsche, Links gibt als dem Browser - deswegen die erste Zeile im Konstruktor. Liegt sicher an irgendetwas Unsinnigem wie dem User Agent, aber das überlasse ich mal dir ;) .

Den Help-Request kriege ich hin. Das neue Hilfesystem hat zwar auch Schwächen, aber gut ist, dass das gewünschte Ergebnis auch direkt als XML kommen kann. Aber erst mal schaue ich, was du da fabriziert hast. ;)
Einloggen, um Attachments anzusehen!
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 22.05.10 06:44 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Edit: Mir war langweilig :D.

:thumbs: Das ist ja grandios. Jetzt benötige ich nur in einem Punkt ein bisschen Hilfe. Schau mal bitte ins Bild im Anhang. Links siehst du das Programm beim Laden. Per MessageBox habe ich mir den XML-Baum der Hauptebene anzeigen lassen:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<children id="-1" locale="de-de" product="WIN32APITUTORIALS" productversion="300">
  <topic id="WIN32API.DELPHI.BASE.INTRO">
    <title>Win32-API-Tutorials für Delphi</title
    <url>WIN32API.DELPHI.BASE.INTRO&topicversion=300&topiclocale=DE-DE&SQM=1</url
    <description /> 
  </topic>
  <topic id="FADF1F04-77DD-43FB-81F6-72E5AE0BFC3D">
    <title>Dokumentation zum Microsoft-Hilfesystem</title
    <url>FADF1F04-77DD-43FB-81F6-72E5AE0BFC3D&topicversion=100&topiclocale=DE-DE&SQM=1</url
    <description /> 
  </topic>
</children>

Im Prinzip zwei Themen samt Titel, ID und URL. Für die Unterebenen sieht der ähnlich aus, und man benötigt beim Request für den Agent nur die ID (<topic id="...">) des jeweiligen Hauptthemas. Rechts im Bild ist dann der fertige TreeView. Oben ist ein leerer Knoten, und darunter beginnen die eigentlichen Themen. Die Struktur der Knoten und Unterknoten entspricht exakt den Einträgen im Inhaltsverzeichnis. Aber die Beschriftung haut nicht hin. Der Knoten mit dem Text nonVCL, was ist das eigentlich? müsste eigentlich Win32-API-Tutorials für Windows heißen, und nonVCL, was ist das eigentlich? käme dann darunter.

Ich bin also irgendwie falsch im Baum drin. Mein Programm flog ständig mit einer Exception raus, darum habe ich ein try/catch eingefügt und in dem Fall erscheint dann die ID und die Angabe (Error):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
client.DownloadStringCompleted += (_, e) =>
{
  var root   = XElement.Parse(e.Result);
  var topics = (IEnumerable)root.XPathEvaluate("topic/@id");
  children   = new Lazy<IEnumerable<TocEntry>>(() =>
    topics.Cast<XAttribute>()
    .Select(id => new TocEntry(id.Value))
    .ToArray()
  );
  RaisePropertyChanged("Children");

  try {
    title = root.XPathSelectElement("topic/title").Value;
  }
  catch {
    title = string.Format("{0} (Error)", topicId);
  }
  client.Dispose();
};

Hast du eine Anregung?
Einloggen, um Attachments anzusehen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 22.05.10 14:16 
Mit topic/@id sammelst du ja die Kinder ein, also bekommst du mit topic/title den Titel des ersten Kindes und nicht des Knotens selbst (und deswegen kracht es auch bei den Blättern). Wenn der Titel wirklich nur im XML des Parents auftaucht, würde ich ihn über den Konstruktor übergeben.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
children   = new Lazy<IEnumerable<TocEntry>>(() =>
  root.Elements("topic")
  .Select(child => new TocEntry(child.Attribute("id").Value, child.Element("title").Value))
  .ToArray()
);

Vielleicht gar nicht schlecht, so spart man sich gleich den Title-Setter :) .

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 22.05.10 14:27 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Mit topic/@id sammelst du ja die Kinder ein, also bekommst du mit topic/title den Titel des ersten Kindes und nicht des Knotens selbst

Aber ich greife doch per "root"-Variable zu. Ich dachte, ich bin dann noch im Hauptbaum. Aber gut, mit der Änderung funktioniert es. Insofern hast du wohl recht. ;)
Was mache ich aber jetzt mit dem leeren Root-Knoten im TreeView?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 22.05.10 14:40 
Wie gesagt, für mich sieht es so aus, als ob die XML ihren eigenen Titel nicht kennen würde :) . Und damit ist die Wurzel tatsächlich anonym.
Aber du könntest sie natürlich überspringen und direkt die Kinder anhängen:
ausblenden C#-Quelltext
1:
DataContext = new TocEntry(-1"" /* oder hier irgendeinen Default-Namen wählen */).Children;					

...was bei näherer Überlegung natürlich nicht hinhauen wird, da Children ja asynchron befüllt wird :gruebel: . Dann würde ich den DataContext erst setzen, wenn der WebClient der Wurzel zurückkehrt.

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 22.05.10 14:42 
Ich probiere das mal aus.
Herzlichen Dank überhaupt erst mal für die Anregungen.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 22.05.10 19:33 
So, jetzt läuft es. Ich musste erst mal rausfinden, wie ich dann an die Daten (die ID) im Baum herankomme. ;)
Nochmals Danke, Kha.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 23.05.10 14:50 
Live-Test mit der WinSDK-Doku: Der Inhalt wird angezeigt. Aber man kann den Agent in die Knie zwingen. :lol:

Die Rootebene lädt noch relativ flott -> Debugwindow von SD4 zeigt sehr schön, wann auf den Agent zugegriffen wird.
Visual Studio 2010 -> Dauert etwas, aber OK.
.NET Framework 4 -> Dauert, TreeView bleibt zu, dann OK.
.NET Framework Class Library -> SD4 rödelt (das Debugwindow zeigt nur noch Zugriffe auf den Agent) und blockiert sich selbst. Irgendwann (nach gefühlten Ewigkeiten) OK.


Beim ersten Versuch hatte ich sogar einen Absturz des Agent (Exception: Alle Protokollhandler sind in Benutzung). Weil der plötzlich weg war, hat auch SharpDevelop eine Exception verursacht.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 23.05.10 16:15 
Ich weiß schon, warum ich ausschließlich den Index und dann direkt Google verwende :mrgreen: .

Ich benutze den H3Viewer, der bleibt bei "Class Library" leider auch eine halbe Minute hängen.

Edit: Deren Changelog enthält auch ein paar interessante Dinge. Zum Beispiel haben sie wohl eine "Agent ready state detection" und dank dem hier lädt "Class Library" jetzt doch in einer halben Sekunde:
mshcmigrate.helpmvp.com/viewer hat folgendes geschrieben:
Normally we read all TOC node children for ever node so we know whether to add [+] gadget. This take a long time for nodes such as .NET Framework classes. So now if > 30 nodes we just assume a [+] anyway and read children when the node is expanded.
Vielleicht doch etwas greedy, mein Ansatz :zwinker: .

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 23.05.10 17:50 
Ich bin nicht sicher, aber der H3Viewer müsste mit Delphi geschrieben worden sein. Dann wird es wohl auch Delphi gewesen sein, wo man das [+] setzen konnte, auch wenn der Knoten noch gar nicht ausgelesen war.


Kann man deinen Ansatz entsprechend ändern? Oder muss man von Null anfangen? Nicht falsch verstehen, Sebastian, ich bin dir für deine Hilfe mehr als dankbar. Ich habe keine Ahnung von WPF, Datenbindung usw. Ich möchte auch nicht, dass du diese Aufgabe für mich löst. Ein bisschen selbst denken (= lernen) will ich ja auch noch. Aber so ein paar Anregungen wären mehr als willkommen. :)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 23.05.10 19:36 
user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
Ein bisschen selbst denken (= lernen) will ich ja auch noch.

Ich hätte jetzt die Idee, dass im Konstruktor nur geprüft wird, ob Children vorhanden sind. Wenn Ja, dann -> Dummyknoten, der auch per neuer Eigenschaft "IsDummy" identifizierbar ist.
Und dann ein "BeforeExpand"-Event in den TreeView, mit dem eine Funktion der Klasse aufgerufen wird, die den Dummyknoten entfernt und das echte TOC lädt.
Ob das funktioniert und die Sache beschleunigt, weiß ich noch nicht.
Mal sehen.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 23.05.10 22:48 
Daran habe ich auch gedacht. Jeder Knoten bekommt seinen Titel von seinem Parent und liest seine eigene Datei (und damit die IDs & Titel seiner Kinder) erst ein, wenn er expandiert wird. Um jeglicher UI-Interaktion aus dem Weg zu gehen ;) , habe ich es allerdings so umgesetzt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    static object[] defaultChild = new object[] { null };
    IEnumerable children;
    public IEnumerable Children
    {
      get
      {
        if (children == null && !client.IsBusy)
          client.DownloadStringAsync(new Uri(server + url));
        return children ?? defaultChild;


Das läuft auch alles flüssig, bis man "Class Library" expandiert. Um zu schauen, welches Kind ein "+" braucht, muss ich doch wohl dann für jedes seine HTML-Seite laden? Da das aber ~300ms in Anspruch nimmt... kann es sein, dass der H3Viewer seine TOC-Daten aus einer anderen Quelle bekommt? &format=toc ist's schonmal nicht :D .

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 24.05.10 06:41 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
kann es sein, dass der H3Viewer seine TOC-Daten aus einer anderen Quelle bekommt?

Der Befehl lautet
ausblenden Quelltext
1:
ms-xhelp://?method=children&id=<ID>&format=xml&product=VS&productVersion=100&locale=en-us					

Einen anderen Request gibt es nicht, und Rob Chandler kocht in dem Fall auch nur mit Wasser. ;) <ID> ist entweder -1 für die Rootebene oder eben die ID des ermittelten Themas. Ergebnis ist der XML-Baum, den ich schon mal weiter oben gezeigt hatte.

Wenn du noch wissen willst, was sich hinter dem
ausblenden Quelltext
1:
http://127.0.0.1:<PORT>/help/<ServerID>-<ProcessID>/ms.help?					

verbirgt. <PORT> ist in der Releaseversion des Hilfesystems immer 47873. Die <ServerID> (bei dir irgendwo im Beispiel 1, bei mir 0) habe ich mit "WTSQuerySessionInformation" ermittelt, und <ProcessID> ist die Prozess-ID der laufenden HelpLibManager-Instanz. Die Umwandlung ist eben notwendig, weil der Agent sonst die Hilfe immer im Browser aufmacht. Wandelst du vorher selbst um, kannst du entweder den Request senden und das Ergebnis abfragen, oder du kannst die HTML-Seiten direkt im eigenen Browser-Control anzeigen lassen.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 24.05.10 11:17 
user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
Ergebnis ist der XML-Baum, den ich schon mal weiter oben gezeigt hatte.
Sag das doch :schmoll: . Bei solch winzigen Datenmengen kann mein Code endlich mit dem H3Viewer mithalten :D .

Damit wir nicht aneinander vorbei reden, mein aktueller Code:
ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
      DataContext = new[] { new TocEntry("-1") { Title = "Sqrt" } };
    }
  }

  class TocEntry : INotifyPropertyChanged
  {
    const string url = "http://127.0.0.1:47873/help/1-3668/ms.help?method=children&id={0}&format=xml&product=VS&productVersion=100&locale=en-us";
    string id;
    WebClient client = new WebClient();

    public TocEntry(string id)
    {
      this.id = id;

      client.DownloadStringCompleted += (_, e) =>
      {
        Debug.WriteLine(Title);
        var children = XElement.Parse(e.Result);

        Children =
            children.Elements("topic")
            .Select(link => new TocEntry(link.Attribute("id").Value) { Title = link.Element("title").Value })
            .ToArray();

        client.Dispose();
      };
    }

    public string Title { get; set; }

    static object[] defaultChild = new object[] { null };
    IEnumerable children;
    public IEnumerable Children
    {
      get
      {
        if (children == null && !client.IsBusy)
          client.DownloadStringAsync(new Uri(string.Format(url, id)));
        return children ?? defaultChild;
      }
      private set
      {
        children = value;
        RaisePropertyChanged("Children");
      }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged(string name)
    {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null) handler(thisnew PropertyChangedEventArgs(name));
    }
  }
}

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 24.05.10 16:10 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
Ergebnis ist der XML-Baum, den ich schon mal weiter oben gezeigt hatte.
Sag das doch :schmoll:

'tschuldigung. Ich dachte, du kennst das Debugfenster des Viewers. ;)
Ich sage dann noch mal artig "Danke" für diese klasse Hilfeleistung. Habe den Code mal eben ausprobiert. :zustimm: