2011-04-22 10 views
5

Sé que estoy haciendo algo mal aquí pero qué. Por favor, eche un vistazo y señale mi error.INotifyPropertyChanged.PropertyChanged always NULL

Veré "Peter" en mi cuadro de texto pero no "Jack" después de hacer clic en el botón.

Mi clase

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

}

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

Y mi código subyacente

public partial class MainWindow : Window 
{ 
    Person person; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     person = new Person();  
    } 

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

Gracias.

+0

hay dos Persona (s). TextBox vinculado a los recursos de Person from Grid, mientras que Button establece el Nombre de Persona del campo privado. Creo que deberías usar una Persona como DataContext de la Ventana. Esto aclarará su código y marcado. –

+0

Es posible que desee leer [esto] (http://msdn.microsoft.com/en-us/library/ms752347.aspx) y [este] (http://msdn.microsoft.com/en-us/library /ms750613.aspx), ya que tienes algunas confusiones en tus enlaces y recursos. –

Respuesta

6

Tiene dos instancias de Persona. PropertyChanged no es nulo en el recurso estático

Esto no es realmente para lo que StaticResources es. Deshacerse del recurso estático, cambiar el enlace a:

{Binding Path=Name, Mode=TwoWay} 

y añadir esto a su constructor:

DataContext = person; 
+0

¡¡Esta es la causa raíz !! – Rohit

+0

Me tomó casi un maldito día llegar hasta aquí. Tu respuesta finalmente resolvió el problema para mí. –

+0

gracias, me salvaste algunas uñas para morder;) – Ray

0

ese objeto persona de código subyacente de MainWindow no es lo mismo objeto que haya unión en el XAML

Si desea utilizar ese objeto de recursos que hay que encontrarla en código detrás así que algo como esto en el constructor

person = (Person)Resources["person"]; 
Cuestiones relacionadas