Laden...

GUI updatet nicht nach einem invoke

Erstellt von sytax vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.516 Views
S
sytax Themenstarter:in
9 Beiträge seit 2019
vor 4 Jahren
GUI updatet nicht nach einem invoke

Moin,

ich habe folgendes problem. ich entwickel ein kleines tool das unter anderem einen client und einen host startet je nach auswahl des anwenders.

die beiden klassen funktionieren auch soweit ganz gut. aber:

wenn sich der client zu einem host verbindet, sendet der host seinen namen als antwort zum client zurück. das klappt auch.

nun möchte ich mit diesem (als string gesendeten namen) im client eine textbox updaten.
es sind asyncrone sockets die ich verwende um die GUI vom host oder client während der übertragung nicht zu blockieren.

um nun ein UI element upzudaten muss ich ein invoke machen um zugriff auf das UI element zu bekommen. auch das klappt. habe das alles mit checkaccess geprüft. ich weise der textbox als content den empfangenen namen zu. das klappt auch. habe ich überprüft indem ich mir den inhalt der textbox auf die console habe ausgeben lassen.

was jetzt nicht passiert das die GUI sich updatet. es ändert sich einfach absolut nix. ich habe schon etliches ausprobiert und mich stundenlang durch viele artikel gewühlt wie man die UI refreshen kann. nix funktioniert.

hat jemand eine idee woran es liegen kann ?

TxtCurrentIp.Dispatcher.Invoke(new Action(() => { TxtCurrentIp.Text = update; }), DispatcherPriority.Render);
16.807 Beiträge seit 2008
vor 4 Jahren

In WPF solltest Du mit dem MVVM Pattern arbeiten, dadurch erübrigt sich auch ein Invoke.
[Artikel] MVVM und DataBinding

S
sytax Themenstarter:in
9 Beiträge seit 2019
vor 4 Jahren

moin nochmal,

also ich versuche jetzt auf mvvm umzustellen. mir ist dabei aber einiges noch nicht klar.

ich habe jetzt ein baseviewmodel erstellt und davon ein model abgeleitet.

ich empfohlenen beitrag für mvvm wird dieses viewmodel dann so instanziert:

this.DataContext = new MainViewModel();

mir ist jetzt aber nicht klar wie ich die methoden im viewmodell ansprechen kann.

in meinem fall habe ich jetzt auf die textbox ein binding gesetzt das auf eine methode im view verweist. nun möchte ich den inhalt der textbox über das view ändern aber ich habe ja keine referenz darauf ... irgendwie bin ich gerade lost.

<TextBox x:Name="TxtCurrentIp" DockPanel.Dock="Left" TextWrapping="NoWrap" Text="{Binding TestIP}" Width="200" Background="{x:Null}" BorderBrush="{x:Null}" Foreground="Green" Margin="5,0,0,0" VerticalScrollBarVisibility="Disabled" FontFamily="Verdana" BorderThickness="0" HorizontalAlignment="Left" VerticalAlignment="Center" IsReadOnly="True"/>

und hier der code vom viewmodel

 public string TestIP
        {
            get { return testIP; }
            set
            {
                if (value != testIP)
                {
                    testIP = value;
                    OnPropertyChanged("TestIP");
                    
                    
                }
            }
        }

4.931 Beiträge seit 2008
vor 4 Jahren

Du änderst nur die ViewModel-Eigenschaften und durch das Binding aktualisiert sich automatisch die View:


TestIP = "Neuer Text";

Wenn du nun von deinem Socket einen gesendeten String erhältst, dann verwende ein Ereignis (event), welches dann vom ViewModel (bzw. darunterliegender Logik/Modell) abonniert wird (s.a. [FAQ] Eigenen Event definieren / Information zu Events (Ereignis/Ereignisse)) und in der Ereignismethode änderst du dann die passende Eigenschaft.

S
sytax Themenstarter:in
9 Beiträge seit 2019
vor 4 Jahren

ist gelöst und kann geschlossen werden.

ich habe mich jetzt umfassender mit mvvm beschäftigt. zu 99% lässt sich alles damit realisieren und ich kann nur jedem anraten von anfang an so in c# zu coden.

derzeit schreibe ich alle meine kleinen lernprojekte komplett neu. mvvm mag zu anfang unverständlich oder zu aufwändig erscheinen aber im verlaufe wird jeder feststellen das alles wesentlich flüssiger läuft und übliche stolpersteine nicht mehr existent sind.

gruß an alle