WPF बाइंडिंग को ताज़ा करने के लिए कैसे बाध्य करें?


112

मुझे एक कॉम्बो बॉक्स मिला है जिसमें साधारण बाइंडिंग का उपयोग करके आइटम स्रोत संलग्न है। कॉम्बो बॉक्स लोड होने के बाद क्या इस बाइंडिंग को रीफ्रेश करने का कोई तरीका है?


1
सरल बंधन से आपका क्या मतलब है? आम तौर पर जब आप बंधन को नियंत्रित करते हैं तो स्वचालित रूप से ताज़ा होना चाहिए।
Erno

12
टेकेई, कोई अपराध नहीं है, लेकिन मेरा मानना ​​है कि एचबी उसके जवाब को स्वीकार करने के योग्य है;;
दानी

1
@ डैनी मुझे यकीन नहीं है कि टेची कभी वापस आ रही है - साढ़े छह साल जब से वह लॉग इन किया गया है
लोनली कोडर

जवाबों:


198

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

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}

लेकिन जैसा कि Blindmeis ने नोट किया है कि आप नोटिफिकेशन को फायर भी कर सकते हैं, आगे अगर आपका कलेक्शन लागू हो जाता है INotifyCollectionChanged(उदाहरण के लिए लागू ObservableCollection<T>) तो यह सिंक हो जाएगा इसलिए आपको इसमें से कुछ भी करने की आवश्यकता नहीं है।


एक ListBox का उपयोग करके मेरे लिए एक काम करने के लिए प्रतीत नहीं होता।
जोनाथन वुड

@JonathanWood: ठीक है, मैं यह नहीं बता सकता कि आपके पास किस तरह का कोड है, जिसमें आपका बंधन कैसा दिखता है। क्या बंधन पहले भी काम करता है?
HB

56

यदि आप mvvm का उपयोग करते हैं और आपका आइटम स्रोत आपके vm में स्थित है। जब आप रिफ्रेश करना चाहते हैं तो बस अपनी संग्रह संपत्ति के लिए INotifyPropertyChanged कॉल करें।

OnPropertyChanged("YourCollectionProperty");

7
यह सबसे साफ तरीका इम्हो है।
ऐश

यह जहां संभव हो किया जाना चाहिए, लेकिन यह ध्यान दिया जाना चाहिए कि यह हमेशा व्यावहारिक नहीं है। उदाहरण के लिए यदि आप किसी सीरियल पोर्ट से जुड़ रहे हैं, और यह देखना चाहते हैं कि यह खुला, बंद, बॉड रेट आदि है या नहीं, तो आप सीरियल पोर्ट के चारों ओर एक आवरण वर्ग बना सकते हैं जो लागू करता है INotifyPropertyChanged, लेकिन आपको पोर्ट को निजी रखना होगा उस रैपर और इस तरह से उस पोर्ट पर सब कुछ के लिए एक संपत्ति और विधि लिखने की जरूरत है जिसे आप प्रोजेक्ट में कहीं और इस्तेमाल करते हैं ताकि यह सुनिश्चित किया जा सके कि जिन गुणों को आप नोट करने में रुचि रखते हैं वे हमेशा रैपर के माध्यम से जाते हैं
Assimilater

8
इसके अलावा, मैं nameof(YourCollectionProperty)शाब्दिक स्ट्रिंग के विपरीत उपयोग करने का एक बड़ा प्रशंसक हूं । यह बग्स को रिफैक्ट करने से रोकता है और अधिक स्पष्ट है कि वास्तव में क्या इरादा है। यह निश्चित रूप से है जहाँ आप उस CallerMemberNameविशेषता का उपयोग नहीं कर सकते हैं जो सम-विषम है
Assimilater

31

मेरे 2 सेंट जोड़ने के लिए, यदि आप अपने डेटा स्रोत को अपने नियंत्रण के नए मूल्य के साथ अपडेट करना चाहते हैं, तो आपको UpdateSource()इसके बजाय कॉल करना होगा UpdateTarget():

((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();

1
मुझे यह उत्तर बेहतर लगा।
चोपनट

8

मल्टीबाइंड फ्रेंडली वर्जन ...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}


0

मैं बैकएंड से डेटा ला रहा था और कोड की सिर्फ एक लाइन के साथ स्क्रीन को अपडेट किया था। इसने काम कर दिया। निश्चित नहीं, हमें इंटरफ़ेस को लागू करने की आवश्यकता क्यों है। (विंडोज़ 10, यूडब्ल्यूपी)

    private void populateInCurrentScreen()
    {
        (this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
        this.Bindings.Update();
    }

यह। बाइंडिंग.अपडेट () स्क्रीन में सभी बाइंडिंग को ताज़ा करता है। FYI करें
Itzdsp

मैंने यह कोशिश की थी। UWP में एक यूजर कॉन्ट्रॉल में बाइंडिंग.उपडेट ()।
जेम्स एश

हाँ। और यह। बाइंडिंग अभी भी मौजूद नहीं है।
जेम्स एश

2
Bindings.Update () केवल वहीं उपलब्ध है जहाँ संकलित बाइंडिंग (x: Bind) का उपयोग किया जाता है ... और संकलित बाइंडिंग केवल UWP में उपलब्ध हैं
Marian Dolinský

कृपया @ MarianDolinský टिप्पणी पर एक नज़र डालें। लगता है कि आपको xaml से
बंधना होगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.