मुझे एक कॉम्बो बॉक्स मिला है जिसमें साधारण बाइंडिंग का उपयोग करके आइटम स्रोत संलग्न है। कॉम्बो बॉक्स लोड होने के बाद क्या इस बाइंडिंग को रीफ्रेश करने का कोई तरीका है?
मुझे एक कॉम्बो बॉक्स मिला है जिसमें साधारण बाइंडिंग का उपयोग करके आइटम स्रोत संलग्न है। कॉम्बो बॉक्स लोड होने के बाद क्या इस बाइंडिंग को रीफ्रेश करने का कोई तरीका है?
जवाबों:
आप बाध्यकारी अभिव्यक्तियों का उपयोग कर सकते हैं:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
.UpdateTarget();
}
लेकिन जैसा कि Blindmeis ने नोट किया है कि आप नोटिफिकेशन को फायर भी कर सकते हैं, आगे अगर आपका कलेक्शन लागू हो जाता है INotifyCollectionChanged
(उदाहरण के लिए लागू ObservableCollection<T>
) तो यह सिंक हो जाएगा इसलिए आपको इसमें से कुछ भी करने की आवश्यकता नहीं है।
यदि आप mvvm का उपयोग करते हैं और आपका आइटम स्रोत आपके vm में स्थित है। जब आप रिफ्रेश करना चाहते हैं तो बस अपनी संग्रह संपत्ति के लिए INotifyPropertyChanged कॉल करें।
OnPropertyChanged("YourCollectionProperty");
INotifyPropertyChanged
, लेकिन आपको पोर्ट को निजी रखना होगा उस रैपर और इस तरह से उस पोर्ट पर सब कुछ के लिए एक संपत्ति और विधि लिखने की जरूरत है जिसे आप प्रोजेक्ट में कहीं और इस्तेमाल करते हैं ताकि यह सुनिश्चित किया जा सके कि जिन गुणों को आप नोट करने में रुचि रखते हैं वे हमेशा रैपर के माध्यम से जाते हैं
nameof(YourCollectionProperty)
शाब्दिक स्ट्रिंग के विपरीत उपयोग करने का एक बड़ा प्रशंसक हूं । यह बग्स को रिफैक्ट करने से रोकता है और अधिक स्पष्ट है कि वास्तव में क्या इरादा है। यह निश्चित रूप से है जहाँ आप उस CallerMemberName
विशेषता का उपयोग नहीं कर सकते हैं जो सम-विषम है
प्रयोग करके देखें BindingExpression.UpdateTarget()
मैं बैकएंड से डेटा ला रहा था और कोड की सिर्फ एक लाइन के साथ स्क्रीन को अपडेट किया था। इसने काम कर दिया। निश्चित नहीं, हमें इंटरफ़ेस को लागू करने की आवश्यकता क्यों है। (विंडोज़ 10, यूडब्ल्यूपी)
private void populateInCurrentScreen()
{
(this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
this.Bindings.Update();
}