Laden...

Label aktualisieren.

Letzter Beitrag vor 8 Monaten 9 Posts 602 Views
Label aktualisieren.

Hallo,

ich habe ein Problem bei meiner WPF Anwendung. Ich habe ein Main Window mit einem Frame wo ich mehrere Pages laden kann. Jetzt möchte ich auf der geladenen Page den Inhalt eines Labels ändern aber aus einer Anderen Klasse heraus und nicht aus der cs der Page selber. Aus der Page selber funktioniert es wunderbar mit INotifyPropertyChanged aber aus einer anderen Klasse funktioniert das nicht. kann mir jemand ein Tipp geben? Wenn ich das Programm im Debug mode anhalte und er in der anderen klasse ist Zeigt mir die Page an das diese nicht Visible ist obwohl sie noch da ist. Ist das der Grund?

Das hört sich nicht so an, als ob Du den MVVM Pattern, den man mit WPF umsetzen sollte, sauber implementiert hast.
[Artikel] MVVM und DataBinding

Was Du mit "andere Klasse" meinst, erschließt sich mir nicht.
Was ist die andere Klasse bei Dir? Eine andere Page? Business Logik...?

Hallo,

das ist meine Page cs.

namespace Testsystem_Standard_view.Pages
{
   /// <summary>
   /// Interaktionslogik für UserPage.xaml
   /// </summary>
   public partial class UserPage : Page, INotifyPropertyChanged
   {
       public event PropertyChangedEventHandler? PropertyChanged;
       private static String _LabTime; 
       MainTest MT = new MainTest();
       public UserPage()
       {
           InitializeComponent();
           DataContext = this;
       }
       public String LabTime 
       {
           get { return _LabTime; }
           set 
           {
               _LabTime = value;
               OnPropertyChanged();
           }       
       }
       protected void OnPropertyChanged([CallerMemberName] string name = null)
       {
           this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
       }
       #region Button
       private void Button_Start(object sender, RoutedEventArgs e)
       {
           //LabTime = "test";
           MT.RunTest();  
       }
       private void Button_Stop(object sender, RoutedEventArgs e)
       {
       }
       private void Btn_Loop_Click(object sender, RoutedEventArgs e)
       {
       }
       #endregion
   }
}

Ich verlasse diese Klasse über den Button Start und gehe in die Main Test Klasse.

Diese hat aktuell nur ein Void , da ich noch am Anfang bin und ich mich neu in WPF einarbeite.

namespace Testsystem_Standard_view
{
   class MainTest:Information_Cls
   {
       internal void RunTest()
       {
           UP.LabTime = "Test";
       }
   }
}

ich hoffe das hilft und ist einigermaßen verständlich.

Es ist nicht ersichtlich, was Deine "Main Klasse" darstellen soll.

Soll das eine Page-To-Page Kommunikation werden, oder soll da Business Logik mit dem Fenster kommunizieren....?

Hallo MDepenMB205,

UP.LabTime = "Test";

Was ist denn UP und wie hast du es initialisiert?


PS:

Dies habe ich schon oft bei Programmieranfängern gelesen:

Diese hat aktuell nur ein Void

Du meinst eine "Methode", denn void ist hier nur der Rückgabetyp dieser Methode (bzw. es bedeutet, daß diese keinen eigentlichen Rückgabewert hat - void bedeutet soviel wie "Leere", "leer" oder "nichtig").

Hallo Abt und Th69, danke vorab für eure Antworten.

Ich möchte kurz den Hintergrund des Projektes erläutern. Diese Oberfläche wird für ein neues Prüfsystem was wir entwickeln und der Vorgänger wurde in vb.net geschrieben und wurde in Forms umgesetzt. Das ganze besteht nachher aus mehreren Klasse wo die einzelnen Prüfschritte drin sind. Aus diesen Klassen soll halt ein Label ständig Aktualisiert werden und das nicht nur auf einer Page. ist das überhaupt möglich, wie ich mir das gedacht habe? Es soll nachher eine Page geben mit Informationen für den Anwender und eine Page für den Entwickler. Die Main Test Klasse die ich abgebildet habe ist nur ein versuch das Label aus einer anderen Klasse zu aktualisieren. Die wird es in Zukunft nicht mehr geben. @Th69 Ich habe in der Main Test klasse die Information_Cls als Basisklasse hinzugefügt. Hier ist eine Instanz UP als UserPage drin.

Warum sollte es nicht möglich sein ein Label im laufenden Betrieb dynamische Inhalte anzeigen zu lassen?

Bei WPF solltest du dringend auch MVVM verwenden, denn genau das ist so von MS so angedacht gewesen und man ist immer gut beraten eine Technologie so zu verwenden wie angedacht.

Man muss dabei die Denkweise etwas abstrakter halten und nicht immer sofort in Labels, Textboxen und Buttons denken. Man trennt in Was (will ich eigentlich darstellen) und Wie (will ich das am schönsten präsentieren).

Hat die Blume einen Knick, war der Schmetterling zu dick.

Hallo BlonderHans,

danke, ich werde mich mal in MVVM einlesen.

Zitat von MDepenMB205

@Th69 Ich habe in der Main Test klasse die Information_Cls als Basisklasse hinzugefügt. Hier ist eine Instanz UP als UserPage drin.

Wenn du dort mit UP = new UserPage()eine Instanz erstellt hast, so ist diese aber eine andere als die bereits sichtbare. Du müßtest schon die Referenz auf die aktuelle UserPage verwenden.

Jedoch solltest du bei WPF nur mit MVVM arbeiten, d.h. mit getrennten ViewModels. Dabei sollte jede View zwar ihr eigenes ViewModel haben, aber du kannst dann Daten zwischen verschiedenen ViewModels (per Referenz) weiterdelegieren.

Die eigentlichen Daten (wie z.B. bei dir die anzuzeigenden Informationen) sind jedoch Teil des Models und können von allen ViewModels benutzt werden. Schau dir dazu auch mal die Beiträge in MVVM - Woher bekommt ein ViewModel übergreifende Daten? Von parallelen ViewModellen oder von darunterliegenden Modellen? sowie WPF & MVVM - Einbindung mehrere ViewModelle in einer View an.