Klassenvererbung

  • VB.NET

Es gibt 46 Antworten in diesem Thema. Der letzte Beitrag () ist von Nuramon96.

    Klassenvererbung

    So hier noch mal meine Frage:

    ich will die klasse DirectoryNode aus diesem Tut : [VB 2010] Hilfe beim Erstellen eines Wpf-Tutorials so umbauen das ich nicht nur Ordner in der TreeView anzeigen kann sondern auch Text den ich aus einer Text-Datei auslese.

    Gruß Nuramon

    Edit: Hier mein bisheriger code: Edit 2: So ?

    VB.NET-Quellcode

    1. Imports GalaSoft.MvvmLight
    2. Imports System.Windows.Forms
    3. Imports System.IO
    4. Imports System.Collections.ObjectModel
    5. Public Class FileSystemTree : Inherits ViewModelBase
    6. Private _Browser As New FolderBrowserDialog _
    7. With {.SelectedPath = (New DirectoryInfo("../../")).FullName}
    8. Public Property Roots As New ObservableCollection(Of DirectoryNode)
    9. Public Property Load As New GalaSoft.MvvmLight.Command.RelayCommand( _
    10. Sub()
    11. Dim FilePath As String = "%appdata%/Telefonbuch/Files/folders.txt"
    12. Dim ItemText As String
    13. Dim reader As New StreamReader(FilePath)
    14. ItemText = reader.ReadLine(1)
    15. Dim root As New DirectoryNode With {.Text = ItemText}
    16. root.LoadRecursive()
    17. Roots.Clear()
    18. Roots.Add(root)
    19. End Sub)
    20. End Class
    21. Public Class FileSystemNode
    22. Public Property item As FileSystemInfo
    23. End Class
    24. Public Class DirectoryInputNode : Inherits DirectoryNode
    25. Public Property Text As String
    26. End Class
    27. Public Class DirectoryNode : Inherits FileSystemNode
    28. Public Property Childs As ObservableCollection(Of FileSystemNode)
    29. Public Sub LoadRecursive()
    30. Childs.Clear()
    31. Dim di = DirectCast(MyBase.item, DirectoryInfo)
    32. For Each d In di.GetDirectories
    33. Dim nd As New DirectoryNode With {.item = d}
    34. nd.LoadRecursive()
    35. Childs.Add(nd)
    36. Next
    37. For Each f In di.GetFiles
    38. Childs.Add(New FileSystemNode With {.item = f})
    39. Next
    40. End Sub
    41. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nuramon96“ ()

    hab noch ein Problem ich kann die funktion irgendwie nicht aufrufen ich hab im xaml coding beim menü die command property auf load gestellt aber der ruft die nicht auf :(

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. Title="MainWindow" Height="350" Width="525"
    5. xmlns:my="clr-namespace:Telefonbuch"
    6. DataContext="{Binding Source={StaticResource Root}}">
    7. <Grid>
    8. <Grid.RowDefinitions>
    9. <RowDefinition Height="auto" />
    10. <RowDefinition />
    11. </Grid.RowDefinitions>
    12. <Grid.ColumnDefinitions>
    13. <ColumnDefinition Width="auto" />
    14. <ColumnDefinition />
    15. </Grid.ColumnDefinitions>
    16. <Menu>
    17. <MenuItem Header="Load" Command="{Binding Path=FileSystemTree.Load}" />
    18. </Menu>
    19. <TreeView Grid.Row="1" Width="150" ItemsSource="{Binding Path=FileSystemTree.Roots}" Name="TreeView1">
    20. <TreeView.Resources>
    21. <HierarchicalDataTemplate DataType="{x:Type my:DirectoryNode}"
    22. ItemsSource="{Binding Path=Childs}">
    23. <StackPanel Orientation="Horizontal">
    24. <Image Width="16" Height="16" Source="/Telefonbuch;component/icons/Folder.png" />
    25. <TextBlock Margin="2 1 0 1" Text="{Binding Path=Text}" />
    26. </StackPanel>
    27. </HierarchicalDataTemplate>
    28. <DataTemplate DataType="{x:Type my:FileSystemNode}">
    29. <StackPanel Orientation="Horizontal">
    30. <Image Width="16" Height="16" Stretch="Fill" Source="/Telefonbuch;component/icons/apple_address_book.png" />
    31. <TextBlock Margin="2 1 0 1" Text="{Binding Path=Text}" />
    32. </StackPanel>
    33. </DataTemplate>
    34. </TreeView.Resources>
    35. </TreeView>
    36. </Grid>
    37. </Window>
    Hahaa! Du hast das Mainmodel verdaddelt.

    Vergleiche dein

    VB.NET-Quellcode

    1. Public Class MainModel
    2. Public Property FileSystemTree As FileSystemTree
    3. End Class
    mit mein

    VB.NET-Quellcode

    1. Public Class MainModel
    2. Public Property FileSystemTree As New FileSystemTree
    3. End Class


    (Aber ich bin dir echt dankbar dafür. Den Fehler habichnur finden können, indem ich im Mainmodel den Lokator-Pattern eingebaut hab.
    Eigentlich wollte ich den euch ersparen, aber hier ist eindeutig gezeigt, dasses unverzichtbar ist.
    Auch unverzichtbar ist ein Abschnitt im Tut über Debugging)
    also hab ich das new vergessen ? okay dann versuch ich das nochmal.

    Edit: okay es lag am New jetzt funktioniert das.
    Danke für die Hilfe.

    Gruß Nuramon

    Edit2: So jetzt noch eine Frage wie kann ich jetzt die Funktion beim Laden des Fensters aufrufen?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nuramon96“ ()

    aber es ist ja ne property und ich weiß nicht wie ich die aufrufen soll

    VB.NET-Quellcode

    1. Public Property Load As New GalaSoft.MvvmLight.Command.RelayCommand( _
    2. Sub()
    3. Dim FilePath As String = "C:/Telefonbuch/Files/folders.txt"
    4. Dim ItemText As String
    5. Dim reader As New StreamReader(FilePath)
    6. ItemText = reader.ReadLine()
    7. Dim root As New DirectoryInputNode With {.Text = ItemText}
    8. root.LoadRecursive()
    9. Roots.Clear()
    10. Roots.Add(root)
    11. End Sub)

    Nuramon96 schrieb:

    Edit: okay es lag am New jetzt funktioniert das.

    Najaa - das zeigt aber auch, dass dir annähernd keines der Kapitel von dieses Buch Lesen erspart bleibt.
    Jdfs. habich den Eindruck, dass dir die Bedeutung des Schlüsselwortes New nicht in voller Tragweite bewußt ist.

    Aber es kann sogar sein, dass diese Grund-Grundlage nicht mal in diesem Buch steht.
    Vlt. hilft VeryBasics dem Verständnis von OOP ein Stück weiter, wenns auch nicht explizit aufs Schlüsselwort New focussiert.

    Nuramon96 schrieb:

    aber es ist ja ne property und ich weiß nicht wie ich die aufrufen soll
    Hmm.
    Das ganze Tutorial dreht sich darum, dass in Wpf alles ans Gui gebunden wird. Da gibt es also jetzt nix aufzurufen, sondern, wenn du das Mainmodel korrigiert hast, ist die App lauffähig, und der Button - der ja korrekt gebunden ist - wird dieses ICommand auslösen.

    Na gut - es ist wirklich eine irre schwierige Umdenke vom prozeduralen Programmieren auf den deklarativen.
    wie du siehst: selbst User-Interaktion wird nicht mehr durch Ereignisse oder Funktions-aufrufe verarbeitet, sondern auch User-Interaktivität wird nun gebunden.
    Ist schon ein bischen irre. ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Echt, dat läuft? Na Hut ab, dann hast du dich aber erheblich verbessert.
    Zeigmal den Code von Command und vonne Node-Klassen.

    Vorher (sorry - ich kann nix dafür ;)) glaubichdirnich.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()