Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

INotifyPropertyChanged.PropertyChanged always NULL

I know I am doing something wrong here but what. Please have a look and point out my error.

I will see "Peter" in my textbox but no "Jack" after the button click.

My class

namespace App
{
    class Person : INotifyPropertyChanged
    {
        private string name;
        public String Name
        {
            get { return name; }
            set { name = value; OnPropertyChanged("Name"); }
        }
    public Person()
    {
        Name = "Peter";
    }

    public void SetName(string newname)
    {
        Name = newname;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string prop)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
}

}

My XAML

<Window x:Class="test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:app="clr-namespace:App"
    Title="MainWindow" Height="400" Width="400">
<Grid>
    <Grid.Resources>
        <app:Person x:Key="person"/>
    </Grid.Resources>
    <TextBox  Width="100" Height="26" Text="{Binding Source={StaticResource person}, Path=Name, Mode=TwoWay}" />
    <Button Content="Button" Height="23"  Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>

And my codebehind

public partial class MainWindow : Window
{
    Person person;

    public MainWindow()
    {
        InitializeComponent();

        person = new Person();       
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        person.SetName("Jack");
    }
}

Thanks.

like image 415
Core-One Avatar asked Apr 22 '11 10:04

Core-One


1 Answers

You have two instances of Person. PropertyChanged is not null in the static resource

This isn't really what StaticResources are for. Get rid of the static resource, change the binding to:

{Binding Path=Name, Mode=TwoWay}

and add this to your constructor:

DataContext = person;
like image 174
James L Avatar answered Oct 05 '22 11:10

James L