2011-04-22 11 views
5

Wiem, że robię coś złego tutaj, ale co. Proszę spojrzeć i wskazać mój błąd.INotifyPropertyChanged.PropertyChanged zawsze NULL

Będę widział "Piotra" w moim polu tekstowym, ale nie "Jack" po kliknięciu przycisku.

Moja klasa

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

}

Moje 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> 

A moja 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"); 
    } 
} 

Dzięki.

+0

Istnieją dwa Osoba (y). TextBox przywiązany do Osoby z zasobów Grida, podczas gdy Przycisk ustawia Nazwę Osoby z prywatnego pola. Myślę, że powinieneś użyć osoby jako DataContext okna. Spowoduje to wyjaśnienie kodu i znaczników. –

+0

Możesz chcieć przeczytać [to] (http://msdn.microsoft.com/en-us/library/ms752347.aspx) & [this] (http://msdn.microsoft.com/en-us/library /ms750613.aspx), ponieważ masz pewne nieporozumienia w swoich powiązaniach i zasobach. –

Odpowiedz

6

Masz dwa wystąpienia osoby. PropertyChanged nie ma wartości NULL w statycznym zasobie

To nie jest to, do czego służą StaticResources. Pozbądź zasobu statyczną, zmień wiązanie:

{Binding Path=Name, Mode=TwoWay} 

i dodać to do konstruktora:

DataContext = person; 
+0

To jest główna przyczyna !! – Rohit

+0

Zajęło mi prawie krwawy dzień, aby zająć tak daleko. Twoja odpowiedź w końcu rozwiązała problem dla mnie. –

+0

dzięki człowieku, uratowałeś mi trochę paznokci do gryzienia;) – Ray

0

tego obiektu osobę w kodzie z MainWindow nie jest ten sam obiekt został wiążący w XAML

Jeśli chcesz korzystać z tego obiektu z zasobów musisz znaleźć go w kodzie tyłu więc coś takiego w konstruktorze

person = (Person)Resources["person"]; 
Powiązane problemy