2011-04-22 13 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"); 
    } 
} 

ありがとうございます。あなたはXAML

内に結合しているメインウィンドウの分離コードで人をオブジェクト

+0

が2人(複数可)があります。 TextBoxはGridのリソースからPersonにバインドされ、ButtonはPersonの名前をprivateフィールドから設定します。私はあなたがウィンドウのDataContextとしてPersonを使うべきだと思います。これにより、コードとマークアップが明確になります。 –

+0

[this](http://msdn.microsoft.com/en-us/library/ms752347.aspx)と[this](http://msdn.microsoft.com/en-us/library)を参照してください。 /ms750613.aspx)、バインディングとリソースにいくつかの混乱があります。 –

答えて

6

Personには2つのインスタンスがあります。 PropertyChangedが静的リソース内でヌルでない

これはStaticResourcesのためのものではありません。静的リソースを取り除く、との結合変更:

{Binding Path=Name, Mode=TwoWay} 

をし、あなたのコンストラクタに以下を追加:

DataContext = person; 
+0

これが根本原因です! – Rohit

+0

これまでのところ、ほとんど血まみれの一日でした。あなたの答えはついに私の問題を解決しました。 –

+0

ありがとう、あなたは私に釘を噛むためにいくつかの釘を救った;) – Ray

0

が同じオブジェクトではありませんあなたは資源からそのオブジェクトを使用したい場合は、その背後にあるコードでは、コンストラクタ

でこのような何かを、それを見つけなければなりません
person = (Person)Resources["person"];