2011-09-27 11 views
7

में बदल दिया गया है, मैं विंडो में टेक्स्टबॉक्स को उस वर्ग के भीतर निहित संपत्ति में बांधना चाहता हूं जो व्यूमोडेल का एक चर है और यह सुनिश्चित करता है कि INotifyPropertyChanged's PropertyChanged ईवेंट कक्षा से अभिभावक तक फैलता है।INotifyProperty subclass

मुझे एक उदाहरण के साथ वर्णन करते हैं:

(विंडो के DataContext ViewModel का एक उदाहरण के लिए सेट है)

public class ViewModel { 
    private OtherClass classInstance = new OtherClass(); 

    public int Attribute { 
     get { return classInstance.Attribute; } 
    } 
} 

public class OtherClass : INotifyPropertyChanged { 
    private int _attribute; 
    public int Attribute { 
     get { return _attribute; } 
     set { 
      _attribute = value; 
      PropertyChanged("Attribute"); 
     } 
    } 
    ... 
} 

इस उदाहरण में समस्या यह है कि, जब गुण परिवर्तन, बाध्य टेक्स्टबॉक्स बाध्यकारी अद्यतन नहीं करता है क्योंकि मुझे लगता है कि यह ViewModel की PropertyChanged ईवेंट को सुन रहा है और अन्य क्लास के उदाहरण की नहीं।

इस स्थिति को हल करने के तरीके पर कोई विचार? मैं अन्य क्लास के इन्सोटिफ़ प्रॉपर्टी को चेन करने के बारे में सोच रहा था, उसके माता-पिता के लिए बदल गया, लेकिन एक बेहतर तरीका होना चाहिए।

उत्तर

6

क्यों प्रॉक्सी का उपयोग करने के बजाय क्लास प्रॉपर्टी पर सीधे बाध्य नहीं है?

public class ViewModel { 
    private OtherClass classInstance = new OtherClass(); 

    public OtherClass MyOtherClass { 
     get { return classInstance; } 
    } 
} 

फिर अपनी बाध्यकारी आप संपत्ति संदर्भ बस कर सकते हैं उपवर्ग

{Binding MyOtherClass.Attribute} 

एक बूंद मृत सरल उदाहरण के माध्यम से है, लेकिन यह काम करता है!

पीछे कोड:

public partial class MainWindow : Window { 
    private readonly SomeClass _someClass = new SomeClass(); 

    public MainWindow() { 
     InitializeComponent(); 
     DataContext = _someClass; 
    } 
} 

public class SomeClass: INotifyPropertyChanged {  
    private readonly SomeSubClass _mySubClass = new SomeSubClass(); 

    public SomeSubClass MySubClass { 
     get { return _mySubClass; } 
    } 

    private String _name; 
    public String Name { 
     get { return _name; } 
     set { 
     _name = value; 
     OnPropertyChanged("Name"); 
     } 
    } 

    //Property Change Stuff 
} 

public class SomeSubClass : INotifyPropertyChanged { 
    private String _name; 
    public String Name { 
     get { 
     return _name; 
     } 
     set { 
     _name = value; 
     OnPropertyChanged("Name"); 
     } 
    } 

    //Property Change Stuff 
} 

XAML:

<Window x:Class="JWC.Examples.WPF.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow"> 
    <StackPanel> 
     <Label Content="Name" VerticalAlignment="Top" /> 
     <TextBox Text="{Binding Name}" /> 
     <Label Content="SubClass.Name" /> 
     <TextBox Text="{Binding MySubClass.Name}" /> 
     <Label Content="Bound to Name" /> 
     <TextBlock Text="{Binding Name}" /> 
     <Label Content="Bound to MySubClass.Name" /> 
     <TextBlock Text="{Binding MySubClass.Name}" /> 
    </StackPanel> 
</Window> 
+0

ड्रॉप मृत सरल उदाहरण उदाहरणों का सबसे अच्छा उदाहरण हैं :) – Moulde

+0

यह कुछ व्यावहारिक नहीं है यदि SomeSubClass में गुणों का ढेर होता है। क्या आप वास्तव में उन सभी संपत्तियों को डुप्लिकेट करने जा रहे हैं? – Sean

+0

@ सेन - मुझे यकीन नहीं है कि "उन सभी गुणों को डुप्लिकेट" से आपका क्या मतलब है। उदाहरण में यह सिर्फ संयोग है कि नाम माता-पिता और बच्चे पर परिभाषित किया गया है। यह अंतर्निहित प्रश्न में कोई फर्क नहीं पड़ता है। मुख्य रूप से, आप प्रॉक्सी वैरिएबल का उपयोग करने की कोशिश करने के बजाय सीधे बाल वर्ग गुणों से जुड़ सकते हैं। उस अर्थ में, शून्य डुप्लिकेशन होगा। – Josh

0

मुझे लगता है कि माता-पिता वर्ग बच्चे की सदस्यता चाहिए की तरह event..something propertyCahnged:

public class ViewModel 
{ 
    private OtherClass classInstance = new OtherClass(); 

    public ViewModel() 
    { 
     classInstance.PropertyChanged += NotifyChildAttributeChanged; 
    } 
    public int Attribute 
    { 
     get { return classInstance.Attribute; } 
    } 
} 

NotifyChildAttributeChanged मूल रूप से एक विधि है कि "गुण" संपत्ति के लिए एक ही सुनता है और की एक PropertyChanged अधिसूचना सक्रिय करता है इसका अपना ..

बेशक हमारे मूल वर्ग को INotifyPropertyChanged को लागू करना होगा और साथ ही सभी ViewModels (अधिमानतः) और आपके डेटाकॉन्टेक्स्ट परिवर्तन का पता लगाएंगे।

4

आप कुछ इस तरह करने की आवश्यकता होगी:

public class ViewModel { 
    public ViewModel() { 
     classInstance = new OtherClass(); 
     classInstance.PropertyChanged += HandleAttributeChanged; 
    } 

    private void HandleAttributeChanged(object Sender, NotifyPropertyChangedEventArgs args) { 
     PropertyChanged("Attribute"); 
    } 
} 

मैं इसे यहाँ नहीं दिखाते हैं, लेकिन आप यह भी IDisposable को लागू करने और अपने बच्चे पर PropertyChanged घटना से सदस्यता समाप्त करना चाहिए, अन्यथा आप स्मृति रिसाव हो जाएगा।

वैकल्पिक रूप से आप classInstance को सार्वजनिक संपत्ति के रूप में बेनकाब कर सकते हैं और ViewModel.classInstance पर बाध्यकारी सेट कर सकते हैं। ध्यान दें कि इसे एक संपत्ति होने की जरूरत है, न कि फ़ील्ड।

+0

यह मेरे PropertyChangedEventArgs के लिए NotifyPropertyChangedEventArgs को बदलने के लिए काम करता है। –

0

यह आप अपने दृश्य मॉडल पर INotifyPropertyChanged को लागू करने के साथ ही जरूरत के आसपास पाने के लिए।बस इंटरफ़ेस और ईवेंट जोड़ें और शेष स्वयं का ख्याल रखेंगे - ईवेंट/कॉल को एक साथ करने की आवश्यकता नहीं है।

संपत्ति प्राप्त करने के लिए प्रतिबिंब का उपयोग करने के लिए इसे देखें।

http://tsells.wordpress.com/2011/02/08/using-reflection-with-wpf-and-the-inotifypropertychanged-interface/

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