2011-04-22 10 views
5

मुझे पता है कि मैं यहाँ कुछ गलत कर रहा हूं लेकिन क्या। कृपया मेरी त्रुटि देखें और देखें।INotifyPropertyChanged.Property हमेशा बदल गया NULL

मुझे अपने टेक्स्टबॉक्स में "पीटर" दिखाई देगा लेकिन बटन क्लिक के बाद "जैक" नहीं होगा।

मेरी कक्षा

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> 

और मेरे 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"); 
    } 
} 

धन्यवाद।

+0

दो व्यक्ति (ओं) कर रहे हैं। टेक्स्टबॉक्स ग्रिड के संसाधनों से व्यक्ति से जुड़ा हुआ है, जबकि बटन निजी क्षेत्र से व्यक्ति का नाम सेट करता है। मुझे लगता है कि आपको विंडो के डेटा कॉन्टेक्स्ट के रूप में एक व्यक्ति का उपयोग करना चाहिए। यह आपके कोड और मार्कअप को स्पष्ट करेगा। –

+0

आप [this] (http://msdn.microsoft.com/en-us/library/ms752347.aspx) पढ़ना चाहेंगे और [यह] (http://msdn.microsoft.com/en-us/library /ms750613.aspx), क्योंकि आपको अपने बाइंडिंग और संसाधनों में कुछ भ्रम हैं। –

उत्तर

6

आपके पास व्यक्ति के दो उदाहरण हैं। PropertyChanged स्थिर संसाधन

में शून्य नहीं है यह वास्तव में StaticResources के लिए नहीं है। स्थिर संसाधन से छुटकारा, के लिए बाध्य बदलने के लिए:

{Binding Path=Name, Mode=TwoWay} 

और अपने निर्माता से जोड़ें:

DataContext = person; 
+0

यह मूल कारण है !! – Rohit

+0

इसे दूर करने के लिए मुझे लगभग एक खूनी दिन लगा। आपके जवाब ने अंततः मेरे लिए समस्या हल की। –

+0

धन्यवाद आदमी, आपने मुझे कुछ नाखूनों को काटने के लिए बचाया;) – Ray

0

कि MainWindow की codebehind में व्यक्ति वस्तु एक ही वस्तु आप XAML

में के लिए बाध्य है तुम इतनी निर्माता

में कुछ इस तरह के पीछे संसाधनों से उस वस्तु आपके पास उपयोग करने के लिए कोड में यह पता लगाना चाहते हैं नहीं है
person = (Person)Resources["person"]; 
संबंधित मुद्दे