myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns
» Datenschutzerklärung
» Impressum

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und Silverlight » GUI updatet nicht nach einem invoke
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

GUI updatet nicht nach einem invoke

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
sytax
myCSharp.de-Mitglied

Dabei seit: 26.03.2019
Beiträge: 5


sytax ist offline

GUI updatet nicht nach einem invoke

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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);
30.04.2019 12:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.740
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

In WPF solltest Du mit dem MVVM Pattern arbeiten, dadurch erübrigt sich auch ein Invoke.
 [Artikel] MVVM und DataBinding
30.04.2019 12:14 Beiträge des Benutzers | zu Buddylist hinzufügen
sytax
myCSharp.de-Mitglied

Dabei seit: 26.03.2019
Beiträge: 5

Themenstarter Thema begonnen von sytax

sytax ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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");


                }
            }
        }
03.05.2019 11:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.256
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
03.05.2019 12:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 26.06.2019 00:59