myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- GUI: WPF und XAML (https://www.mycsharp.de/wbb2/board.php?boardid=85)
--- GUI updatet nicht nach einem invoke (https://www.mycsharp.de/wbb2/thread.php?threadid=121830)


Geschrieben von sytax am 30.04.2019 um 12:07:
  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 ?

C#-Code:
TxtCurrentIp.Dispatcher.Invoke(new Action(() => { TxtCurrentIp.Text = update; }), DispatcherPriority.Render);


Geschrieben von Abt am 30.04.2019 um 12:14:
 
In WPF solltest Du mit dem MVVM Pattern arbeiten, dadurch erübrigt sich auch ein Invoke.
 [Artikel] MVVM und DataBinding


Geschrieben von sytax am 03.05.2019 um 11:48:
 
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:

C#-Code:
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.

XML-Code:
<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

C#-Code:
public string TestIP
        {
            get { return testIP; }
            set
            {
                if (value != testIP)
                {
                    testIP = value;
                    OnPropertyChanged("TestIP");


                }
            }
        }


Geschrieben von Th69 am 03.05.2019 um 12:13:
 
Du änderst nur die ViewModel-Eigenschaften und durch das Binding aktualisiert sich automatisch die View:

C#-Code:
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.


Geschrieben von sytax am 27.06.2019 um 11:06:
 
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


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.11.2019 10:18