2012-08-15 11 views
6

मेरे पास एक ऐसा एप्लिकेशन है जहां आप ListBox में विभिन्न ऑब्जेक्ट्स के बीच चयन कर सकते हैं। जब आप कोई ऑब्जेक्ट चुनते हैं, तो यह नियंत्रण के लिए व्यूमोडेल बदल देता है। नियंत्रण कोडप्लेक्स से टाइमलाइन नियंत्रण का उपयोग करता है, और इसके कारण, मेरे पास ViewModel से जुड़े टाइमलाइन डेटा के लिए स्टार्टडेट और एंडडेट है। जब ViewModel बाहर बदल गया है, मैं कभी कभी कोई त्रुटि मिलती है:OnPropertyChange फायरिंग ऑर्डर

ArgumentOutOfRangeException: MaxDateTime cannot be less then MinDateTime 

यह केवल तब होता है जब मैं पहले के एक तारीख को एक बाद की तारीख से जाना। मुझे पूरा यकीन है कि गुणों को स्वचालित रूप से दृश्य में अपडेट करने के तरीके के कारण है। यह प्रासंगिक एक्सएएमएल है। इस समस्या को हल एक तरह से

 private int myObjectIndex; 
     public int MyObjectIndex 
     { 
      get { return myObjectIndex; } 
      set { myObjectIndex = value; OnPropertyChanged("MyObjectIndex"); MyObject = MyObjects[myObjectIndex]; } 
     } 

     private MyObjectViewModel myObject=new MyObjectViewModel(); 

     public MyObjectViewModel MyObject   { 
      get { return myObject; } 
      set 
      { 
       myObject= value; 
       OnPropertyChanged("MyObject"); 
      } 
     } 

वहाँ है:

MaxDateTime="{Binding Path=RecordingEnd}" 
MinDateTime="{Binding Path=RecordingStart}" 
CurrentDateTime="{Binding Path=CurrentDateTime, Mode=TwoWay}" 

ViewModel इस है? क्या WPF को बताने का कोई तरीका है जो ऑब्जेक्ट के भीतर पैरामीटर को अपडेट किया जाना चाहिए?

अद्यतन: मैं @ colinsmith की प्रतिक्रिया का एक परिवर्तन का उपयोग कर समाप्त हो गया:

public MyObjectViewModel MyObject { 
    get { return myObject; } 
    set 
    { 
     myObject= new MyObjectViewModel(); 
     OnPropertyChanged("MyObject"); 

     myObject= value; 
     OnPropertyChanged("MyObject");  
    } 
} 
+0

मैं तीन परिभाषाएँ कि क्रम में नहीं हैं यह सोचते हैं रहा हूँ? और क्या आप स्पष्टीकरण दे सकते हैं "जब व्यूमोडेल बदल जाता है" तो आपका क्या मतलब है "बदल गया"? –

+0

जब आप यूआई से कोई आइटम चुनते हैं तो यह ऑब्जेक्ट का कारण बनता है और अपडेट करता है? – Paparazzi

+0

जिज्ञासा से बाहर, क्या आप ऑर्डर को बदलने की कोशिश कर सकते हैं जो आपने प्रॉपर्टी को CurrentDateTime = MinDateTime = MaxDateTime = पर सेट कर दिया है ... ऑर्डर शायद मायने रखता है ... यानी। आपकी तिथि सीमा विभिन्न मॉडलों पर अलग होती है .... जब मॉडल डेटा गुणों में सेट होता है ... आपको उन्हें वैध होने की आवश्यकता होती है जब यह गुणों को अपडेट कर रहा है उदा। CurrentDateTime को न्यूनतम/अधिकतम सीमा में होना आवश्यक है .... और अधिकतम दिमागी समय –

उत्तर

1

आप इस कोशिश कर सकते हैं:

public MyObjectViewModel MyObject   { 
      get { return myObject; } 
      set 
      { 
       myObject=null; 
       OnPropertyChanged("MyObject"); 

       myObject= value; 
       OnPropertyChanged("MyObject"); 
      } 
     } 
+0

मुझे पहले एक समान दृष्टिकोण का उपयोग करना पड़ा - यह सुनिश्चित करता है कि नए मूल्य लागू होने से पहले किसी भी बाइंडिंग को शून्य मान के साथ अपडेट किया जाए। – Charleh

+0

यदि आप मेरे संपादित प्रश्न को देखते हैं, तो आप पाएंगे कि मुझे ऑब्जेक्ट को रिक्त उदाहरण के बजाय शून्य के बजाय सेट करना था क्योंकि इसके कुछ अन्य संदर्भों के कारण। हालांकि यह बहुत अच्छा काम किया। – jle

+0

@jle .... क्या ऐसा है कि आपको अपनी आउटपुट विंडो में दिखाई देने वाली बाध्यकारी त्रुटियां नहीं मिलती हैं, जबकि यह शून्य स्थिति में है? केवल एक सलाह...आप अपने MyObject के भीतर एक "स्थिर" खाली MyObject परिभाषित कर सकते हैं और प्रत्येक बार एक नया निर्माण करने के बजाय इंगित कर सकते हैं। –

0

आप या तो इस तथ्य को संभाल सकता है कि एक मिनट datetime अधिकतम datatime से पहले अद्यतन किया जा सकता है और कुछ को अमान्य करने यानी डेफर सेटिंग (अधिकतम और न्यूनतम दोनों अधिकतम और मिनट अद्यतन किए जाते हैं)। यह बहुत त्रुटि-प्रवण हो सकता है। या, आप अधिकतम और न्यूनतम मूल्य बना सकते हैं ताकि वे केवल एक ही समय में अपडेट हो सकें। जैसे RecordingEnd और RecordingStart होने के बजाय RecordingSpan है जिसमें अधिकतम और न्यूनतम दोनों हैं।

+0

मुझे यकीन नहीं है कि रिकॉर्डिंगस्पैन द्वारा आपका क्या मतलब है? त्रुटि के साथ समयरेखा नियंत्रण पुस्तकालय का हिस्सा है। – jle

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