kein Zugriff auf Public Sub oder Vaiable im MainWindow aus einem Modul

  • WPF

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von eichseinet.

    kein Zugriff auf Public Sub oder Vaiable im MainWindow aus einem Modul

    Hallo Leute.

    Ich ärgere mich seit einer Weile mit WPF herum. Was da alles im Vergleich zu den Forms-Anwendungen nicht mehr geht...
    Mein aktuelles Problem; Aus einem Modul besteht kein Zugriff auf Variabeln, die im MainWindow als public erstellt sind. Auch auf eine Public Sub ist kein Zugriff möglich. Steuerelemente sind ja wie laß gleich gar aus dem Modul nicht ansprechbar.
    Wie kommt man aus dem Modul an die Public Variabeln und Subs ran?

    nutze Visual Studio 2017 und programmiere in VB.

    Gruß

    eddi

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

    Gar net.
    Databinding ist das Stichwort. Man bindet Properties.

    Und auch in Forms ists ganz schlechter Stil, wenn man von Modulen aus auf Steuerelemente zugreift.
    Sauber gecodet sind Module Hilfs-Konstrukte der Objekte, also ein Steuerelement kann auf Modul-Member zugreifen - nicht umgekehrt.

    guggemol Grundlagen - MVVM-Anwendungs-Struktur
    Aber wenn du von Module in Steuerelemente zu grabschen gewohnt bist, wird dir das Umdenken grosse Mühe machen.
    Nach nun 3 Tagen bin noch immer kaum weiter mit den Bindings. Komplizierter gehts wohl nicht mehr. Früher mit einer Zeile ner Textbox oder nem Label den Text zugewiesen, heute braucht man ein Studium und schreibt den halben Bildschirm voll.
    Binding an Listen, Datenquellen oder andere Textboxen finde ich. Wie bindet man ein Label am besten direkt aus XAML an eine simple Variable? Ich beschreib im Code die Variabe und mein Label bekommt den Text... hoffentlich.

    Gruß

    eddi
    Hallo

    Ist nicht so schlimm wie man am Anfang glauben mag.

    Lies mal ab folgenden Kapitel meiner Tutorialreihe nach. Tutorialreihe <WPF lernen/>
    Aber versuche es wirklich zu lesen und zu verstehen, das spart dir in weiterer Folge viel stress, glaub mir.
    Keine Angst, ist nicht si viel, zahlt sich aber aus.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hab schon den Film zum Buch gesehen. ;)
    Im Ernst: hab schon ein paar deiner Videos zum Thema gesehen. Danke dafür. Trotzdem kann ich noch immer nichts an eine Variable binden. Das wär für meine simplen Zwecke das Einfachste. Das sollte doch wohl gehen, oder? Ich betreib das nur als Hobby, um mir ein paar kleine Tools zu erschaffen, die das Leben erleichtern.

    GRuß

    eddi
    Dann zeig doch den Code und deinen XAML dazu und wir sehen mal was da nicht hinhaut.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    eichseinet schrieb:

    Mein Problem besteht darin, dass ich keine Ahnung habe auf was ich für eine Variable verweisen müsste.

    Weil du das Kapitel NICHT gelesen, geschweige denn probiert hast. Denn in dem Kapitel 2.1.4.2 ist das alles enthalten!!
    Das kannst du mir also nicht erzählen. Da warst du einfach zu faul das anszusehen und zu probieren. Sorry, nicht böse gemeint.

    Also:

    CodeBehind der MainWindow.vb:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Class MainWindow
    3. Implements INotifyPropertyChanged 'Implementieren des WPF Benachrichtigungsmechanismus
    4. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    5. Me.DataContext = Me 'Wir binden den View an diese Klasse, also an MainWindow.vb
    6. HalloWelt = "Test mit Binding in Hallo Welt" 'Das Property mit Text füllen
    7. End Sub
    8. Private _halloWelt As String
    9. Public Property HalloWelt() As String
    10. Get
    11. Return _halloWelt
    12. End Get
    13. Set(ByVal value As String)
    14. _halloWelt = value
    15. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(HalloWelt)))
    16. End Set
    17. End Property
    18. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    19. End Class


    XAML:

    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. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:WpfResizeGrip"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="174.255" Width="400.745" >
    9. <StackPanel>
    10. <TextBox Text="{Binding HalloWelt}" Margin="15"></TextBox>
    11. </StackPanel>
    12. </Window>


    Ist nicht schwer oder?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hab das Video gesehen, aber ab diesem Teil eigentlich nur noch Bahnhof verstanden. Mit dem Anfang kam ich noch klar, als es um den Zugriff direkt auf andere Steuerelemte wie die Textboxen ging. Also ist das so wie ich es vor hatte gar nicht möglich. Man muss den ganzen Aufbau mit den Properties und den Notifyern machen. Ich fürchte das wird ein langes Projekt. Wenn die Forms unter Win10 bei einer Skalierung über 100% nicht völlg unscharf wären...
    Also morgen nochmal von vorne.

    Danke schon mal

    eddi
    Ist weis nicht ob etwas möglich ist. Ich kenne deinen Cide nicht und auch nicht deinen istzustand deiner Klassen. Du zeigst ja nix. Mein Glaskugel ist da machtlos.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Meiner bisheriger Code ist kaum vorhanden. Das eigentliche Projekt ist noch ganz neu. Da ist soweit ich es bisher verstehe aber auch schon viel Falsches dabei. Gerade dein Video hat mich vermuten lassen, dass wie anfangs im XAML gezeigt nicht nur eine Bindung von Textbox zu Textbox, sondern genauso einfach auch auf eine gewöhnliche Variable möglich wäre. Das ist ja offensichtlich falsch. Da muss ich mich dann durch die Bindings arbeiten.
    Das von dir oben noch einmal zusammengefasste Beispiel hab ich für etwas anderes gehalten. Aber wenn ich das nun endlich richtig verstehe, dann ist dieses Property "HalloWelt" im Grund nur eine globale Variable. _halloWelt ist dann eine temporäre Variable, mit der die Funktion im Hintergrund arbeitet.

    Bisher hab ich meine "Projekte" (meine größtes hat etwa 2000 Zeilen Code :rolleyes: ) als Forms-Anwendung geschrieben. Hauptfenster, in dessen Codebereich dann z.B. Textboxen und Labels für den ersten Start initialisiert. Für alles andere ein Modul, das dann hier aufgerufen wurde und seine Arbeit tat. Für jeden eingenstädigen Arbeitsteil ein Modul. So blieb es übersichtlicher. Wenn ich das richtig verstehe nimmt man heute für seinen "normalen" VB-Code kein Modul mehr, sondern eine Klasse?

    Momentan arbeite ich an neuen Projekten, die NUR die Tests zum Binding enthalten. Wenn ich das Prinzip mal verstehe kanns in mein Projekt wandern.

    Me.DataContext = Me
    Das versteh ich noch nicht ganz. Angenommen ich hätte eine Klasse Test. Dort erstelle ich jetzt das Property HalloWelt. Muss es dann im MainWindow Me.DataContext = Test heissen?

    Jetzt werd ich erst mal wieder loslegen und ein wenig probieren.

    Gruß

    eddi
    @eichseinet

    Um mit der WPF vernünftig zu Arbeiten solltest du grundlegende Kenntnisse über die Objektorientierte Programierung aneignen.
    Sonst stellst du dir selbst ein Bein.

    Es gibt auch kostenlose Bücher.

    Den Rest kannst du hier ja erfragen, aber Grundlegende dinge sollten schon sitzen weil:

    eichseinet schrieb:

    Aber wenn ich das nun endlich richtig verstehe, dann ist dieses Property "HalloWelt" im Grund nur eine globale Variable. _halloWelt ist dann eine temporäre Variable, mit der die Funktion im Hintergrund arbeitet.

    Ne, ein Property ist und bleibt ein Property und eine private Variable bleibt auch eine.

    eichseinet schrieb:

    Für alles andere ein Modul, das dann hier aufgerufen wurde und seine Arbeit tat. Für jeden eingenstädigen Arbeitsteil ein Modul.

    Sowas habe ich ja noch nie gehört, das ist ja schrecklich!!

    Vorausgesetzt du möchtest programmieren lernen. Es macht spaß, wenn man es denn durchzieht.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Eines hab ich wohl falsch ausgedrückt: Ich ruf natürlich nicht das Modul selbst auf. DArin liegen dann Subs oder Functions, die ich aus einem anderen Modul heraus aufrufe. Im Grunde wie in einer SPS (Steuerung einer Maschine).
    Wenn ich euch da richtig verstehte teil ihr den Code dann gar nicht auf? Alles in einer Klasse untereinander geschrieben?

    @ErfinderdesRades: Ich hab das Grundprinzip des Viewmodel schon begriffen. Oberfläche/Anzeige wird komplett von der Logik getrennt und ist daher für den Programmierer schnell für andere Prokjekte austauschbar. Auch das Binding versteht ich vom groben Prinzip. Z.B. der Text eines Labels wird an etwas anders gebunden; nennen wir es passend zu meinem Verständnislevel "Dinges". :)
    Ändert sich nun "Dinges", dann ändert sich mein Labeltext, ausgelöst von einem dafür erstellten Event. Und ab da hörts dann bei mir auf. Was genau ich nun wie mit wem verbinduen muss verstehe ich noch nicht. Außerdem liegt scheinbar eines meiner Hauptprobleme am Aufbau meiner Programme. Wie erwähnt soll der Zugriff aus einer Sub in einem Modul auf die Texteigenschaft des Labels stattfinden. Und das scheint ja wohl grundsätzlich nicht der richtige Weg zu sein.

    Statt also nach meiner ganzen Vorarbeit zum Programmablauf nun endlich zu programmieren, werd ich wohl die nächsten Monate nur lernen wie mans macht...
    Ich freu mich.

    Danke für eure Hilfe

    Gruß

    eddi