2008-10-31 22 views
29

मेरे पास WPF ListBox है जो संग्रह को बदलने पर एक ऑब्जर्जेबल कोलेक्शन, से जुड़ा हुआ है, सभी आइटम अपनी स्थिति अपडेट करते हैं।अपडेट करने के लिए डेटा बाध्य WPF ListBox को मजबूर करने का एक बेहतर तरीका?

नई स्थिति संग्रह में संग्रहीत है लेकिन यूआई अपडेट नहीं होता है। तो मैं जोड़ा निम्नलिखित:

void scenarioItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     ToolboxListItem.UpdatePositions(); 
     lstScenario.ItemsSource = null; 
     lstScenario.ItemsSource = ToolboxListItem.ScenarioItems; 
     this.lstScenario.SelectedIndex = e.NewStartingIndex; 
    } 

ItemsSource शून्य पर स्थापित करने और उसे फिर से बाध्यकारी, यूआई अद्यतन किया जाता है के द्वारा,

लेकिन यह शायद बहुत बुरा कोडन है: पी

सुझाव?

+0

क्या आप "संग्रह में परिवर्तन करते समय, सभी आइटम अपनी स्थिति अपडेट करते समय" के बारे में अधिक जानकारी दे सकते हैं, बस इतना ही मैं सुनिश्चित कर सकता हूं कि मैं आपके प्रश्न का सही उत्तर दे रहा हूं? – Donnelle

उत्तर

72

मैं एक लिस्टबॉक्स एक वस्तु संपत्ति प्रकार List<MyCustomType>() की है जो करने के लिए बाध्य है उम्मीद करेंगे और मैं सत्यापित निम्नलिखित कोड को अपडेट करता लिस्टबॉक्स जब सूची यह अद्यतित है।

void On_MyObjProperty_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
{ 
    MyListBox.Items.Refresh(); 
} 

आपको अभी भी समस्या का सामना कर रहे हैं, तो वी.एस. आईडीई उत्पादन खिड़की (Ctrl + W, ओ) स्कैन और देखें कि आप सूचना किसी भी बाध्यकारी त्रुटियों पहचान सकते हैं।

+0

यह समस्या को हल करने लगता है, इसलिए मैं बग प्रश्न को किसी अन्य पोस्ट में ले जाऊंगा। धन्यवाद! – TimothyP

+0

धन्यवाद गिशू! –

+0

इस पर टिप्पणी करने के बाद से दो साल से अधिक हो गया है ... बहुत बहुत धन्यवाद! –

4

मुझे कल भी यही समस्या थी, और यह बकवास का पूरा टुकड़ा है :) ... हालांकि मैं अब शून्य को स्थापित नहीं कर रहा हूं। मेरे परिदृश्य में, मैं इसे MyList.ToArray() पर सेट कर रहा हूं (हर बार जब मैं सूची में जोड़ता हूं)।

मैंने कई देखा है "ओह, आपको एक पर्यवेक्षण सूची का उपयोग करने की आवश्यकता है" < - पूरा बकवास।

मैंने कई "ओह, कॉल 'ताज़ा करें" < - पूर्ण बकवास देखा है।

मेरी upsettedness माफ करें, लेकिन मैं भी इस काम करने के लिए :)

+0

मेरा विश्वास करो, मैं आपकी निराशा को समझ सकता हूं, इसलिए कोई अपराध नहीं हुआ। मैंने GetBindingExpression का उपयोग करने का प्रयास किया है, लेकिन एक नल में retuls: p – TimothyP

+0

मेरा "GetBindingExpression" शून्य वापस नहीं आता है ... लेकिन अगर मैं "अपडेट लक्ष्य" कहता हूं तो यह कुछ भी नहीं करता है :(... केवल इस मामले में ... यह सबकुछ के लिए बहुत अच्छा काम करता है। –

0

यदि आपके पास ऑब्जेक्ट्स का अवलोकन करने योग्य सूची है, और आप उन वस्तुओं के अंदर गुण बदल रहे हैं, तो संग्रह लागू नहीं होता है क्योंकि संग्रह सीधे नहीं बदल रहा है। मैं अपनी ऑब्जेक्ट गुणों को संग्रह में बदलने के लिए अधिसूचना() का उपयोग कर अधिसूचना को मजबूर कर रहा हूं, फिर पुरानी प्रति को हटाने के लिए RemoveAt() को निकालें। यह सुंदर नहीं है, लेकिन यह काम करता है।

9

डब्ल्यूपीएफ सूची सूची में वस्तुओं की एक सूची/संग्रह बाध्यकारी, लेकिन यूआई अपडेट किए जाने के बाद रीफ्रेशिंग नहीं, हल

मैं सिर्फ बेवकूफ हूँ। जबकि मैं List<> के बजाय ObservableCollection<> का उपयोग करने के बारे में बहुत कुछ पढ़ता हूं, मैंने अभी भी इस सुझाव को अनदेखा करना जारी रखा है और इसका कोई फायदा नहीं हुआ है। मेरी किताबों पर वापस आ गया और फिर से पढ़ा। यह बहुत अच्छी तरह से समझाया गया है कि ObservableCollection<> का उपयोग करना आवश्यक है क्योंकि List<>INotifyCollectionChange इंटरफ़ेस को ListBox के लिए आवश्यक नहीं है जब आइटम संग्रह में आइटम बदलते हैं।

इस अद्यतन कोड है:

private ObservableCollection<StringWrapper> m_AppLog; 
ObservableCollection<StringWrapper> Log { get { return m_AppLog; } } 

सुंदर सरल है, और कुछ और की आवश्यकता नहीं है (उदाहरण के लिए ताज़ा())।

// notify bound objects 
OnPropertyChanged("Log"); 

ObservableCollection एक धागा है जो इसे का निर्माण नहीं किया द्वारा एक अद्यतन का समर्थन नहीं करता: क्योंकि ObservableCollection परिवर्तन घटना को ट्रिगर का ही ख्याल रखता है, मैं अनावश्यक कॉल दूर करने के लिए कर रहा था। मेरी सूची (एक दृश्य लॉग हाल में हुई त्रुटियां/जानकारी संदेश दिखाने के लिए) क्योंकि विभिन्न धागे से अद्यतन किया जा सकता है, मैं अपने कोड अद्यतन सुनिश्चित करने के लिए इस तरह से समायोजित करने के लिए जोड़ने सूची के अपने डिस्पैचर साथ किया गया था:

public void AddToLog(string message) { 
    if (Thread.CurrentThread != Dispatcher.Thread) { 
     // Need for invoke if called from a different thread 
     Dispatcher.Invoke(
      DispatcherPriority.Normal, (ThreadStart)delegate() { AddToLog(message); }); 
    } 
    else { 
     // add this line at the top of the log 
     m_AppLog.Insert(0, new StringWrapper(message)); 
     // ... 

यह भी ध्यान रखें कि ObservableCollection<>List<> के विपरीत RemoveRange() का समर्थन नहीं करता है। सूची से ऑब्जर्जेबल कोलेक्शन में स्विच करते समय यह आवश्यक समायोजन का हिस्सा है।

+0

मैंने यह गलती भी की और मुझे समाधान मिलने से पहले काफी समय लगा। +1। – JSideris

2

यह पुरानी चीजें है, लेकिन एक ऑब्जर्जेबल कोलेक्शन का उपयोग करें। यदि आप यूआई को पर्यवेक्षण चयन के ऑब्जेक्ट्स में गुणों के अपडेट देखना चाहते हैं, तो आपको उस ऑब्जेक्ट के लिए कक्षा परिभाषा में बदलकर INotifyProperty को लागू करने की आवश्यकता है। फिर संपत्ति को प्रत्येक संपत्ति के सेटटर में घटना बदल दीजिए।

Public Class Session 
Implements INotifyPropertyChanged 

Public Event PropertyChanged As PropertyChangedEventHandler _ 
    Implements INotifyPropertyChanged.PropertyChanged 

Private Sub NotifyPropertyChanged(ByVal info As String) 
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info)) 
End Sub 

Private _name As String = "No name" 
''' <summary> 
''' Name of Session 
''' </summary> 
''' <value></value> 
''' <returns></returns> 
''' <remarks></remarks> 
Public Property Name() As String 
    Get 
     Return _name 
    End Get 
    Set(ByVal value As String) 
     _name = value 
     NotifyPropertyChanged("Name") 
    End Set 
End Property 
6

मुझे आपके पास जो भी हो रहा है, उसके समान समस्या हो सकती है, लेकिन मुझे यकीन नहीं है।

मेरे पास ObservableCollection<MyEntity> और ListBox इसके लिए बाध्य था। लेकिन कुछ अजीब कारण मेरे ListBox को अपडेट नहीं किया जा रहा था जब मैंने सूची में MyEntity ऑब्जेक्ट्स के गुणों को बदल दिया था।

थोड़ी देर के लिए खोज करने के बाद मैं निम्नलिखित पृष्ठ मिला और मैं बस आपको यह बताने के लिए किया था:

http://www.wblum.org/listbind/net3/index.html

यह अद्यतन करने के लिए एक ListBox प्राप्त करने के लिए आप क्या करना है की एक बहुत ही अच्छा वर्णन है जब सूची, या इसके भीतर की वस्तुओं, बदल जाती है। उम्मीद है कि आप इससे फायदा उठाएंगे।

+0

यह बहुत अच्छा है, बहुत बहुत धन्यवाद! विशेष रूप से आपको केवल 'ListBox' में निहित कक्षा के लिए INotifyPropertyChanged लागू करने की आवश्यकता है मेरे लिए दिलचस्प था। –

+1

यह डोमेन बिक्री के लिए है। –

0

मेरे लिए, यह ListBox और ListView में एक बग की तरह दिखता है। मैं एक पर्यवेक्षण चयन के लिए बाध्यकारी हूं, संग्रह में आइटम INotifyPropertyChanged लागू करें। जब मैं गतिशील रूप से अपना 'ऐड आइटम' बटन दबाता हूं तो यूआई कोई अतिरिक्त आइटम नहीं दिखाता है, हालांकि मेरे पास काउंटर कंट्रोल है जो MyCollection.Count से जुड़ा हुआ है। प्रत्येक बार जब मैं अपना 'ऐड आइटम' बटन दबाता हूं तो यह काउंटर कंट्रोल बढ़ता है। यदि मैं दृश्य का आकार बदलता हूं, तो सूची बॉक्स मेरे सभी जोड़े गए आइटम दिखाता है। तो, ListBox नियंत्रण पर बाध्यकारी आइटमसोर्स टूटा हुआ है। मैंने किसी भी समय एक नया MyCollection नहीं बनाने का ख्याल रखा, जो बाध्यकारी तोड़ देगा। बू हू

+0

लॉल्ज़, मेरी स्थिति में, समस्या यह थी कि किसी ने वास्तव में पर्यवेक्षण चयन नामक कक्षा को लागू किया था! इसलिए, मेरा संग्रह वास्तव में INotifyCollectionChanged लागू नहीं कर रहा था, भले ही इसे ObservableCollection कहा जाता था। चीज़। एक बार जब मैं अपमानजनक नामस्थान हटा देता हूं, और सिस्टम का उपयोग करता हूं। चयन। ऑब्जेक्टमोडेल सब कुछ ठीक था। doh! – flobadob

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