INotifyPropertyChanged.PropertyChanged всегда NULL - PullRequest
5 голосов
/ 22 апреля 2011

Я знаю, что я делаю что-то не так, но что. Пожалуйста, посмотрите и укажите мою ошибку.

Я увижу «Питер» в моем текстовом поле, но после нажатия кнопки «Джек» не будет.

Мой класс

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

}

Мой 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>

И мой код позади

public partial class MainWindow : Window
{
    Person person;

    public MainWindow()
    {
        InitializeComponent();

        person = new Person();       
    }

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

Спасибо.

Ответы [ 2 ]

6 голосов
/ 22 апреля 2011

У вас есть два экземпляра человека.PropertyChanged не равен нулю в статическом ресурсе

Это не совсем то, для чего нужны StaticResources.Избавьтесь от статического ресурса, измените привязку на:

{Binding Path=Name, Mode=TwoWay}

и добавьте это в свой конструктор:

DataContext = person;
0 голосов
/ 22 апреля 2011

Этот объект персонажа в коде позади MainWindow - это не тот объект, с которым вы связываетесь в XAML

Если вы хотите использовать этот объект из ресурсов, вы должны найти его в коде, так что-то вроде этого в конструкторе

person = (Person)Resources["person"];
...