2011-04-22 53 views
5

我知道我在这里做错了什么,但是什么。请看看并指出我的错误。INotifyPropertyChanged.PropertyChanged始终为NULL

我会在我的文本框中看到“Peter”,但点击按钮后没有“Jack”。

我班

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

谢谢。

+0

有两个人(一个或多个)。 TextBox绑定到来自Grid资源的Person,而Button则从Private域设置Person的Name。我认为你应该使用一个Person作为Window的DataContext。这将澄清你的代码和标记。 – 2011-04-22 10:15:05

+0

您可能想要阅读[this](http://msdn.microsoft.com/en-us/library/ms752347.aspx)&[this](http://msdn.microsoft.com/en-us/library /ms750613.aspx),因为你在绑定和资源方面有些混乱。 – 2011-04-22 13:28:28

回答

6

您有两个Person实例。 PropertyChanged在静态资源中不为空

这不是静态资源的用途。摆脱静态资源,转变的结合:

{Binding Path=Name, Mode=TwoWay} 

,并添加到您的构造函数:

DataContext = person; 
+0

这是根本原因! – Rohit 2011-04-22 11:01:46

+0

花了我几乎血腥的一天,以达到这个目标。你的回答终于为我解决了这个问题。 – 2011-12-05 12:24:40

+0

谢谢你,你救了我一些钉子咬人;) – Ray 2014-05-21 12:41:36

0

,在主窗口的代码隐藏对象的人是不是你在XAML

结合到同一个对象。如果你想使用资源的对象你必须找到它的代码,所以像这样的构造

背后
person = (Person)Resources["person"]; 
相关问题