Laden...

PropertyChangedEventHandler propertyChanged ist immer null

Erstellt von raneu vor 12 Jahren Letzter Beitrag vor 12 Jahren 7.499 Views
R
raneu Themenstarter:in
65 Beiträge seit 2005
vor 12 Jahren
PropertyChangedEventHandler propertyChanged ist immer null

Ich bin halb am verzweifeln.
Hab da ein kleines Projekt welches einfach den Text einer Textbox ei drücken der Buttons aktualisieren soll.

Aber mein propertyChanged ist immer null und ich keine Ahnung was verkehrt ist.

Mein Binding sollte eigentlich funktionieren da bei der Initialiserung der Klasse Message die Eigenschaft von "Nachricht" angezeigt wird.

Danke schon mal für Hilfe.

Hier der xaml code:


<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication3" 
        Title="MainWindow" Height="350" Width="525">
     <Window.Resources>
          <local:Message x:Key="mes1"/>
     </Window.Resources>
    <Grid>
          <TextBox Text="{Binding Source={StaticResource mes1}, Path=Nachricht, UpdateSourceTrigger=PropertyChanged}"/>
          <Button Content="Button1" Name="button1" Click="button1_Click" Margin="0,98,0,183" HorizontalAlignment="Left" Width="132" />
          <Button Content="Button2" Name="button2" Click="button2_Click" Margin="0,169,371,109" />
     </Grid>
</Window>

Der Code vom window:


       public partial class MainWindow : Window
       {
              Message m = new Message();

              public MainWindow()
              {
                     InitializeComponent();
              }

              private void button1_Click(object sender, RoutedEventArgs e)
              {
                     m.Nachricht = "Message 1";
              }

              private void button2_Click(object sender, RoutedEventArgs e)
              {
                     m.Nachricht = "Message 2";
              }
       }

und meine Klasse Message:


     class Message : INotifyPropertyChanged
       {  
              public Message()
              {
                     Nachricht = "Test";
              }
             
              private string nachricht;
              public string Nachricht
              {
                     get
                     {
                            return nachricht;
                     }
                     set
                     {
                            if (value != nachricht)
                            {
                                   nachricht = value;
                                   RaisePropertyChanged("Nachricht");
                            }
                     }

              }

              protected virtual void RaisePropertyChanged(string propertyName)
              {
                     PropertyChangedEventHandler propertyChanged = PropertyChanged;
                     if (propertyChanged != null)
                     {
                            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
                     }
              }

              public event PropertyChangedEventHandler PropertyChanged;     
       }

5.742 Beiträge seit 2007
vor 12 Jahren

Mein Binding sollte eigentlich funktionieren da bei der Initialiserung der Klasse Message die Eigenschaft von "Nachricht" angezeigt wird.

Der Schein trügt: Du erstellst zwei _Message_s - einmal in XAML und einmal im Code.

Schreibe besser in den Konstruktor des Fensters


this.DataContext = m;

Und lasse bei den Bindings alles außer Path weg.

Dann sollte es klappen.

R
raneu Themenstarter:in
65 Beiträge seit 2005
vor 12 Jahren
PropertyChangedEventHandler propertyChanged ist immer null

Danke erstmal für Deine Hilfe.

Aber leider funktioniert es auch so nicht.

propertyChanged immer noch null. 🙁

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo raneu,

es funktioniert nicht, warum wurde gesagt:

Der Schein trügt: Du erstellst zwei Messages - einmal in XAML und einmal im Code.

D.h. du hast di Message des DataContext, falls du den nun setzt, und die Message des StaticResources. Für eines von Beidem musst du dich entscheiden.

Gruß,
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

R
raneu Themenstarter:in
65 Beiträge seit 2005
vor 12 Jahren

Funtzt!

👍

Aber trotzdem noch mal die Anmerkung.

Wie funktioniert es ohne


this.DataContext = m; 

d.h. wie kann ich es nur mit xaml code lösen?

So funktioniert es ncht.
In code behind ist der DataContext auskommentiert.


this.DataContext = m; 


<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication3" 
        Title="MainWindow" Height="350" Width="525">
     <Window.Resources>
          <local:Message x:Key="mes1"/>
     </Window.Resources>
    <Grid>
          <TextBox DataContext="mes1" Name="lb1" Text="{Binding Path=Nachricht}"/>
          <Button Content="Button1" Name="button1" Click="button1_Click" Margin="0,98,0,183" HorizontalAlignment="Left" Width="132" />
          <Button Content="Button2" Name="button2" Click="button2_Click" Margin="0,169,371,109" />
     </Grid>
</Window>

Danke an Euch beide!

R
raneu Themenstarter:in
65 Beiträge seit 2005
vor 12 Jahren

Und noch eine Frage. 🙂

Wie krieg ich denn sowas raus.
Debugger?? nee oder.

Output nix gefunden

109 Beiträge seit 2011
vor 12 Jahren

Wie funktioniert es ohne

  
this.DataContext = m;   
  

d.h. wie kann ich es nur mit xaml code lösen?

Den DataContext setzt man in xaml mittels

    <Windows.DataContext>
        <_local:m/>
    </Windows.DataContext>

Viele Grüße

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....