Laden...

INotifyPropertyChanged für Textblock updatet nichts

Erstellt von Keytronic vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.332 Views
K
Keytronic Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren
INotifyPropertyChanged für Textblock updatet nichts

Hi zusammen!
Ich habe ein Problem mit INotifyPropertyChanged und kann nach längerer Suche den Fehler leider nicht finden. Vielleicht findet hier ja jemand schnell einen Fehler.
Vielen Dank schon mal für jeden Hinweis!

Also das Problem ist einfach, dass der Textblock gar nichts anzeigt, sobald die gewünschte Variable sich ändert. Hab mit Console.WriteLine(var) auch die Variable ausgegeben, also scheinen die setter und getter durchaus zu funktionieren.

Hier der Code:

#1: Klasse Text:


namespace test
{
   public class Text : INotifyPropertyChanged
   {
       public event PropertyChangedEventHandler PropertyChanged;

       private string text_old;

       public void OnPropertyChanged(String propertyName)
       {
           PropertyChangedEventHandler tempHandler = PropertyChanged;
           if (tempHandler != null)
               tempHandler(this, new PropertyChangedEventArgs(propertyName));
       }


       public string Text_old
       {
           get
           {
               return text_old;
           }
           set
           {
              text_old = value;
              OnPropertyChanged("Text_old");
           }
       }        
 }
}

#2: MainWindow.xaml:


<TextBlock Text="{Binding Path=Text_old, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0"/>
<TextBlock Text="{Binding Path=Text_new, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="2"/>

#3: MainWindow.xaml.cl
...lass ich jetzt mal der übersichtshalber weg und füge die datei nur hinzu falls der fehler nicht in den beiden anderen dateien liegt 😉

letztendlich ruf ich hier halt die getter und setter auf, um was in Text_old und Text_new zu schreiben.

344 Beiträge seit 2006
vor 10 Jahren
public string Text_old
        {
            get
            {
                return text_old;
            }
            set
            {
               text_old = value;
               OnPropertyChanged("Text_alt");
            }
        }

Text_alt oder Text_old?

Gruss Lothi

K
Keytronic Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

*

344 Beiträge seit 2006
vor 10 Jahren

Hallo

Als Parameter von OnPropertyChanged() solltest du den den Namen des Property übergeben und das ist Text_old 😉

Gruss Lothi

K
Keytronic Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

Text_alt

M
402 Beiträge seit 2005
vor 10 Jahren

Hi...

Ist die Instanz der Klasse "Test" auch DataContext von MainWindow?

Wir setzt du das?

lg
M@TUK

5.658 Beiträge seit 2006
vor 10 Jahren

Hi M@TUK,

sowohl im XAML als auch im C#-Code verwechselst du englische und deutsche Bezeichner. Da wäre ein bißchen mehr Sorgfalt angebracht, bevor du hier postest. Ansonsten verstehe ich deine Konstruktion in der OnPropertyChanged-Methode nicht so recht. Wieso rufst du dort nicht das PropertyChanged-Event auf, sondern einen temporären EventHandler?

Christian

Weeks of programming can save you hours of planning

4.939 Beiträge seit 2008
vor 10 Jahren

Hallo MrSparkle,

der Aufruf im OnPropertyChanged ist schon in Ordnung so. Dies ist das gängige Pattern, um thread-safe das Event aufzurufen, s. aber auch C# Events and Thread Safety (d.h. es gibt einige Kontroversen bzgl. dieses Konstrukts).

K
Keytronic Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

Ist die Instanz der Klasse "Test" auch DataContext von MainWindow?

Wir setzt du das?

also hier mal ein auszug von mainwindow:


namespace test
{
   /// <summary>
   /// Interaktionslogik für MainWindow.xaml
   /// </summary>
   public partial class MainWindow : Window
   {
       private Text text;

       public MainWindow()
       {
           InitializeComponent();
           text = new Text();
       }
   }
}

4.939 Beiträge seit 2008
vor 10 Jahren

Dein Code beantwortet doch schon die Frage....
Setze DataContext im Konstruktor und dann sollte das Updaten der TextBoxen auch funktionieren.

Wenn du nicht weißt, was der DataContext (bzw. DataBinding) bedeutet, dann lies dich mal ein, z.B. Visual C# 2010 - Datenbindung oder DataContext in WPF

K
Keytronic Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

ok danke!