2011-04-22 34 views
5

Tôi biết tôi đang làm điều gì sai ở đây nhưng cái gì. Vui lòng xem và chỉ ra lỗi của tôi.INotifyPropertyChanged.PropertyChanged luôn là NULL

Tôi sẽ thấy "Peter" trong hộp văn bản của tôi nhưng không có "Jack" sau khi nhấp vào nút.

Lớp học của tôi

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 My

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

Và codebehind tôi

public partial class MainWindow : Window 
{ 
    Person person; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     person = new Person();  
    } 

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

Cảm ơn.

+0

Có hai Person (s). TextBox được liên kết với Person từ các tài nguyên của Grid, trong khi Button thiết lập Name of Person từ trường private. Tôi nghĩ bạn nên sử dụng một Person như DataContext của Window. Điều này sẽ làm rõ mã của bạn và đánh dấu. –

+0

Bạn có thể muốn đọc [this] (http://msdn.microsoft.com/en-us/library/ms752347.aspx) & [this] (http://msdn.microsoft.com/en-us/library /ms750613.aspx), vì bạn có một số nhầm lẫn trong các ràng buộc và tài nguyên của bạn. –

Trả lời

6

Bạn có hai phiên bản Person. PropertyChanged không phải là null trong tài nguyên tĩnh

Đây không thực sự là những gì mà StaticResources đang sử dụng. Thoát khỏi các tài nguyên tĩnh, thay đổi liên kết với:

{Binding Path=Name, Mode=TwoWay} 

và thêm video này vào constructor của bạn:

DataContext = person; 
+0

Đây là nguyên nhân gốc rễ !! – Rohit

+0

Hãy cho tôi gần như một ngày đẫm máu để có được điều này đến nay. Câu trả lời của bạn cuối cùng đã giải quyết được vấn đề cho tôi. –

+0

cảm ơn người đàn ông, bạn đã cứu tôi một số móng tay để cắn;) – Ray

0

Đó đối tượng người trong codebehind của MainWindow không phải là cùng một đối tượng bạn đã gắn vào trong XAML

Nếu bạn muốn sử dụng đối tượng từ các nguồn lực bạn phải tìm nó trong mã đằng sau nên một cái gì đó như thế này trong constructor

person = (Person)Resources["person"]; 
Các vấn đề liên quan