2012-12-01 34 views
7

(सी # 2010 में प्रो WPF से अंश) सी # में पढ़ते समय प्रो WPF 2010 लेखक लिखते हैं:INotifyProperty के बिना अधिसूचना बदलें बदलें?

"आप प्रत्येक संपत्ति के लिए एक घटना को बढ़ा सकते हैं इस मामले में, घटना नाम PropertyNameChanged होना आवश्यक है (उदाहरण के लिए। , UnitCostChanged)। जब संपत्ति बदल जाती है तो घटना को आग लगाना आपके ऊपर निर्भर करता है। "

क्या कोई इस सुविधा की पुष्टि कर सकता है? मैं प्रयोग किया गया था और इस व्यवहार पुन: पेश करने में सक्षम नहीं (मैं अगर यह इतना काम करता है देखना चाहता हूँ तो मैं गतिशील प्रकार बनाने के लिए System.Reflection.Emit के साथ प्रयोग कर कुछ कर सकते हैं)

संपादित करें: मैं जोर यहाँ स्पष्ट करना चाहिए , INotifyPropertyChanged को लागू करने के बिना परिवर्तन सूचना को लागू करने के रूप में यह है कि क्या किताब

यहाँ दावा कर रहा है है है POCO मैं के साथ परीक्षण कर रहा है:

public class Employee 
{ 
    private string _FirstName; 
    public string FirstName 
    { 
     get 
     { 
      return _FirstName; 
     } 
     set 
     { 
      if (_FirstName != value) 
      { 
       _FirstName = value; 
       if (FirstNameChanged != null) 
       { 
        FirstNameChanged(this, new PropertyChangedEventArgs("FirstName")); 
       } 
      } 
     } 
    } 
} 

मैं एक डेटा ग्रिड को यह बाध्य और पृष्ठभूमि अद्यतन में एक टाइमर है फर्स्टनाम संपत्ति यादृच्छिक रूप से हर कुछ सेकंड onds लेकिन डेटा ग्रिड कभी नहीं आग

<DataGrid x:Name="dgEmployees" ItemsSource="{Binding ElementName=mainWindow, Path=MyEmployees}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" /> 
     </DataGrid.Columns> 
    </DataGrid> 

FirstNameChanged घटना हमेशा रिक्त है (मैंने सोचा था कि बाध्यकारी इंजन स्वचालित रूप से इसे करने के लिए सदस्यता सकता है अगर यह नामकरण परंपरा के अनुसार यह पता चला)। MyEmployees सिर्फ एक अवलोकन करने योग्य चयन

क्या कोई यह पुष्टि कर सकता है कि लेखक इस विशेषता का उल्लेख करता है, वास्तव में काम करता है और यदि मैं कोई गलती कर रहा हूं?

संपादित करें: जो सोचता है मैं पाठ की गलत व्याख्या कर रहा हूँ किसी के लाभ के लिए:

"आप इस समस्या को हल करने के लिए तीन तरीकों का उपयोग कर सकते हैं:

आप उत्पाद कक्षा में प्रत्येक संपत्ति बना सकते हैं सिंटैक्स का उपयोग करके एक निर्भरता संपत्ति जिसे आपने अध्याय 4 में सीखा है। (इस मामले में, आपकी कक्षा निर्भरता ऑब्जेक्ट से प्राप्त होनी चाहिए।) हालांकि इस दृष्टिकोण को आपके लिए (जो अच्छा है) के लिए काम करने के लिए WPF प्राप्त होता है, यह सबसे अधिक बनाता है तत्वों में समझ-वर्ग जिनके पास दृश्य एपी है एक खिड़की में नाशपाती। यह उत्पाद जैसे डेटा वर्गों के लिए सबसे प्राकृतिक दृष्टिकोण नहीं है।

आप प्रत्येक संपत्ति के लिए एक ईवेंट बढ़ा सकते हैं। इस मामले में, ईवेंट में नाम होना चाहिए PropertyNameChanged (उदाहरण के लिए, UnitCostChanged)। यह आपके ऊपर पर निर्भर करता है जब संपत्ति बदल जाती है।

आप सिस्टम को कार्यान्वित कर सकते हैं। कॉम्पोनेंटमोडेल.इनोटिफ़ाईप्रॉपर्टी इंटरफ़ेस, जिसे PropertyChanged नामक एक ईवेंट की आवश्यकता होती है। आपको संपत्ति प्रॉपर्टी चेंज इवेंट बढ़ाएं जब भी कोई संपत्ति बदलती है और इंगित करती है कि संपत्ति को स्ट्रिंग के रूप में संपत्ति नाम की आपूर्ति करके बदल दिया गया है। यह WPF के साथ, आप DependencyProperties या INotifyPropertyChanged उपयोग करने की आवश्यकता अप को आप इस घटना को बढ़ाने के लिए जब एक गुण परिवर्तन, लेकिन आप प्रत्येक संपत्ति के लिए एक अलग घटना को परिभाषित करने की जरूरत नहीं है अभी भी है। "

+2

सुनिश्चित नहीं हैं कि वाक्य रचना काम करेंगे, लेकिन आप यकीन है कि आप को लागू करने के रूप में वर्ग को सजाने के लिए की जरूरत है INotifyPropertyChanged – Paparazzi

+0

नहीं, यह वास्तव में क्या है मैं मैं इस बात से बचने की कोशिश कर रहा हूं - पुस्तक में, यह उल्लेख करता है कि 3 तकनीकें हैं।) निर्भरता प्रॉपर्टीज बी का उपयोग करें।) इनोटिफ़ाईप्रॉपर्टी चेंज (जिसका मैं पहले से ही परिवार हूं) सी का उपयोग करता हूं।) इस सम्मेलन-आधारित दृष्टिकोण का उपयोग करें जो INotifyPropertyChanged को लागू नहीं करता है। इस तरह का पूरा बिंदु है मैं यहां क्या परीक्षण कर रहा हूं :) – blue18hutthutt

+0

ठीक है लेकिन मुझे नहीं लगता कि दावा किया जा रहा है। आप सीधे NotifyPropertyChanged विधि के बिना ईवेंट बढ़ा सकते हैं, लेकिन मुझे लगता है कि आपको अभी भी INotifyPropertyChanged को लागू करने की आवश्यकता है। – Paparazzi

उत्तर

9

मैं इसे जैसे कि यह किताब में दावा किया जा रहा है, जब तक मैं पूरी तरह से प्रश्न की बात को अनदेखा कर रहा हूँ, या तो INotifyPropertyChanged या निर्भरता गुण उपयोग किए बिना अपने POCO के दशक में परिवर्तन अधिसूचना लागू करने के लिए बहुत संभव है कहेंगे।

आप {प्रॉपर्टी} कहा जाता अपने POCO से बदल दिया जब एक संपत्ति के मूल्य बदल गया है एक घटना बढ़ा देते हैं, WPF बाध्यकारी प्रणाली है कि लेने, और प्रासंगिक बाइंडिंग अद्यतन करेगा।

प्रर्दशित करने के लिए इस छोटे से कार्यक्रम देखें - यह सबसे सरल बात मैं के बारे में सोच सकता है, लेकिन मुझे लगता है कि यह आपके मामले में रूप में अच्छी तरह काम करना चाहिए।

XAML:

<StackPanel> 
    <TextBlock Text="{Binding Name}" /> 
    <Button Content="Change name" Click="changeNameClick" /> 
</StackPanel> 

कोड-पीछे:

public partial class Window1 : Window 
{ 
    private SimpleObject so = new SimpleObject(); 

    public Window1() 
    { 
     InitializeComponent(); 

     this.so = new SimpleObject(); 
     so.Name = "Initial value"; 

     this.DataContext = so; 

     var t = new DispatcherTimer(
      TimeSpan.FromSeconds(1), 
      DispatcherPriority.Normal, 
      (s, e) => { this.so.Name = "Name changed at: " + DateTime.Now.ToString(); }, 
      Dispatcher); 
    } 

    private void changeNameClick(object sender, RoutedEventArgs e) 
    { 
     this.so.Name = "New value!!"; 
    } 
} 

public class SimpleObject 
{ 
    private string mName = null; 

    public string Name 
    { 
     get { return mName; } 
     set 
     { 
      if (mName != value) 
      { 
       mName = value; 

       if (NameChanged != null) 
        NameChanged(this, EventArgs.Empty); 
      } 
     } 
    } 

    public event EventHandler NameChanged; 
} 
+1

पर वर्णित करता है! मुझे पता था कि मैं पागल नहीं था। मेरा मूल कोड अब काम करता है लेकिन केवल "PropertyChangedEventHandler" को एक सादे "EventHandler" में बदलने के बाद .. कोई विचार क्यों है? क्या यह "फीचर" कहीं भी दस्तावेज है? बढ़िया, आपको बहुत धन्यवाद – blue18hutthutt

+1

हे, कोई खेद नहीं, मुझे सच में नहीं पता कि वह क्यों है। मुझे कुछ समय पहले इस बारे में सुनना याद है, लेकिन वास्तव में कभी भी इसे अपने कोड में इस्तेमाल नहीं किया है। और मुझे वास्तव में कहीं भी कोई वास्तविक दस्तावेज नहीं मिल रहा है, इसलिए शायद यह एक बहुत व्यापक रूप से उपयोग की जाने वाली तकनीक नहीं है .. –

+1

यदि आपकी दिलचस्पी है तो मुझे कुछ अतिरिक्त अंतर्दृष्टि है - निरीक्षण से, पीओसीओ प्रकार पर डिफ़ॉल्ट प्रॉपर्टी डिस्क्रिप्टर आलसी लोडेड है जो रिफ्लेक्टप्रोपर्टी डिस्क्रिप्टर का एक उदाहरण है - विशेष रुचि के लिए SupportsChangeEvents बूलियन प्रॉपर्टी है। यह रनटाइम द्वारा सत्य पर सेट किया गया है यदि कक्षा संपत्ति नाम का पालन करती है चेंज नामकरण सम्मेलन (हालांकि यह तब तक काम नहीं करता जब तक कि मैं एक सादा EventHandler का उपयोग नहीं करता) या INotifyPropertyChanged लागू करता है। या तो की अनुपस्थिति यह झूठी हो जाएगी। http://msdn.microsoft.com/en-us/library/system.componentmodel.propertydescriptor.supportschangeevents.aspx – blue18hutthutt

-1

नहीं है,। के लिए संग्रह, INotifyCollectionChanged चाल भी करेगा।

+0

स्पष्ट रूप से आप उत्तर देख सकते हैं। – blue18hutthutt

+1

वास्तव में एक चौथा तरीका है - आप हमेशा बाइंडिंगएक्सप्रेस पर अद्यतन लक्ष्य() विधि को मैन्युअल रूप से बढ़ा सकते हैं लेकिन यह सुनिश्चित नहीं है कि मैं उस – blue18hutthutt

3

पैटर्न आप का उल्लेख WPF के साथ ही Windows प्रपत्र (WinForms) पर लागू होता है। MSDN पर Binding Sources Overview में "सूचनाएं बदलें प्रदान करना" अनुभाग:

+0

लिंक के लिए धन्यवाद! अंत में एमएसडीएन पर एक निश्चित लिंक है जो इसे – blue18hutthutt

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^