2009-04-30 5 views
8

मुझे एक ऐसा दृश्य मिला है जो GetAll():अपने बाइंड को रीफ्रेश करने के लिए आइटम्ससोर्स कैसे प्राप्त करें?

<DockPanel> 
    <ListBox ItemsSource="{Binding GetAll}" 
      ItemTemplate="{StaticResource allCustomersDataTemplate}" 
      Style="{StaticResource allCustomersListBox}"> 
    </ListBox> 
</DockPanel> 

GetAll() मेरे व्यूमोडेल में एक अवलोकन योग्य चयन गुण है:

public ObservableCollection<Customer> GetAll 
{ 
    get 
    { 
     return Customer.GetAll(); 
    } 
} 

जिसमें एक सूची बॉक्स दिखाता है को GetAll() मॉडल विधि को कॉल करता है जो अवलोकन योग्य को भरने के लिए एक XML फ़ाइल पढ़ता है .:

public static ObservableCollection<Customer> GetAll() 
{ 
    ObservableCollection<Customer> customers = new ObservableCollection<Customer>(); 

    XDocument xmlDoc = XDocument.Load(Customer.GetXmlFilePathAndFileName()); 
    var customerObjects = from customer in xmlDoc.Descendants("customer") 
          select new Customer 
          { 
           Id = (int)customer.Element("id"), 
           FirstName = customer.Element("firstName").Value, 
           LastName = customer.Element("lastName").Value, 
           Age = (int)customer.Element("age") 
          }; 
    foreach (var customerObject in customerObjects) 
    { 
     Customer customer = new Customer(); 

     customer.Id = customerObject.Id; 
     customer.FirstName = customerObject.FirstName; 
     customer.LastName = customerObject.LastName; 
     customer.Age = customerObject.Age; 

     customers.Add(customer); 
    } 

    return customers; 
} 

यह सब ठीक काम करता है जब उपयोगकर्ता किसी अन्य दृश्य पर जाता है, XML फ़ाइल संपादित करता है और वापस आता है इस दृश्य में जहां पुराना डेटा अभी भी दिखा रहा है।

मैं इस दृश्य को "बाइंडिंग रीफ्रेश" करने के लिए कैसे कह सकता हूं ताकि यह वास्तविक डेटा दिखा सके।

ऐसा लगता है कि मैं बहुत अधिक HTML/HTTP रूपक के साथ WPF के बारे में जा रहा हूं, मुझे लगता है कि ऑब्जर्जेबल कोलेक्शन को स्वयं अपडेट करने के लिए एक और प्राकृतिक तरीका है, इसलिए इसका नाम है, लेकिन यह एकमात्र तरीका है इस समय उपयोगकर्ता को एक WPF एप्लिकेशन में डेटा संपादित करने में सक्षम होना चाहिए। तो किसी भी स्तर पर मदद की सराहना की है।

उत्तर

12

एक ItemsControl उसके बाध्यकारी अनुरोध करता है और इसके बाद संदर्भ को कैश करता है।

यदि संग्रह ऑब्जेक्ट की सामग्री संशोधित की जाती है, और यह INotifyCollectionChanged लागू करता है (ObservableCollection करता है), तो यह कोई अतिरिक्त या हटाई गई वस्तु को उठाएगा।

अब, अगर आप बाध्यकारी ListBox के लिए एक नया संग्रह वस्तु की आपूर्ति करना चाहते हैं, तो आप अपनी व्यू-मॉडल INotifyPropertyChanged को लागू करने और संपत्ति नाम के रूप में GetAll में गुजर PropertyChanged बढ़ा, हो सकता है। इसका बाध्यकारी चेतावनी का असर होगा कि संपत्ति मूल्य बदल गया है (वहां एक नया ObservableCollection उठाया जाने वाला तैयार है), जो इसे ListBox पर आपूर्ति करेगा, जो इसकी वस्तुओं को फिर से उत्पन्न करेगा।

तो जब तक आप अपने ऐप से परिवर्तन को प्रभावित करते हैं, ObservableCollection पर काम करते हुए GetAll पर लौटाया जाता है, तो आप जोड़ और निकाल सकते हैं और सूची सिंक में रहेगी। जब आप बाहरी संशोधनों को चुनना चाहते हैं (आपके पास कहीं ताज़ा बटन हो सकता है, या एक प्राकृतिक बिंदु जहां यह पूरी फ़ाइल को फिर से लोड करने के लिए समझ में आता है), तो आप अपना व्यू-मॉडल PropertyChanged ईवेंट बढ़ा सकते हैं, जो स्वचालित रूप से संपत्ति को कॉल करेगा गेटर, जो स्थिर विधि को कॉल करेगा, जो एक नया नया संग्रह वापस करेगा।

नाइटपिकर नोट: आप गुणों के लिए विधि नाम क्यों देते हैं?

+0

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

+0

यदि दोनों विचारों को संस्करण के दौरान सिंक्रनाइज़ किया जाना चाहिए, तो हाँ, आपको किसी भी वस्तु को किसी भी तरह साझा करने की आवश्यकता है। आपके मामले में, डेटा एक्सेस सिस्टम हो सकता है जो संग्रह को लोड और कैश करता है, और प्रत्येक व्यूमोडेल वर्तमान संग्रह का अनुरोध करेगा। इस तरह वे दोनों एक दूसरे के संशोधन के बारे में जानते हैं। अब यदि आपको फ़ाइल से संग्रह को फिर से लोड करने की आवश्यकता है, तो आपके पास संग्रह दृश्य ऑब्जेक्ट बदल गया है, ताकि प्रत्येक व्यूमोडेल को चेतावनी देने का एक तरीका होगा, ताकि वे अपना संदर्भ बदलकर एक बार नया प्रॉपर्टी चेंज किया जा सके। –

+0

तो अब जब भी उपयोगकर्ता नियंत्रण (दृश्य) लोड हो जाता है, तो डेटासोर्स को रीफ्रेश करने के लिए मेरा समाधान, बहुत अच्छा काम करता है, धन्यवाद! –

0

अपने ObservableCollection और XML फ़ाइल के अंतिम-संशोधित समय को संदर्भित करते समय संदर्भित रखें। जब भी खिड़की फोकस हो जाती है, डिस्क फ़ाइल पर टाइमस्टैम्प की जांच करें। यदि यह बदल गया है, तो ObservableCollection साफ़ करें और फिर से पॉप्युलेट करें। जीयूआई स्वचालित रूप से ObservableCollection से परिवर्तन घटनाओं के लिए सुन रहा है और जब आप संग्रह की सामग्री को संशोधित करते हैं तो स्वचालित रूप से फिर से पॉप्युलेट हो जाएगा।

7
ही जब हम संग्रह में वस्तु को जोड़ने, निकालने के रूप में

लाइन काम नीचे:

CollectionViewSource.GetDefaultView(CustomObservableCollection).Refresh(); 
संबंधित मुद्दे

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