2013-02-09 40 views
13

मेरे पास मेरे UI पर एक सूची बॉक्स है जो ObservableCollection की एक संपत्ति से जुड़ा हुआ है। मैंने दृश्य मॉडल के कन्स्ट्रक्टर में संपत्ति में ऑब्जर्जेबल कोलेक्शन का एक नया उदाहरण सेट किया है और मैं फॉर्म पर एक बटन के साथ आइटम जोड़ सकता हूं। ये सूची में दिखाई दे रहे हैं।अवलोकन योग्य चयन बाध्यकारी खो देता है जब मैं "नया"

सब अच्छा है।

हालांकि, अगर मैं बटन कॉलबैक में नई साथ संपत्ति reinitialize, यह बाध्यकारी टूट जाता है और यूआई नहीं रह गया है क्या संग्रह में है पता चलता है।

मुझे लगता है कि बाध्यकारी संपत्ति के मूल्यों को देखना जारी रखेगा, लेकिन संभवतः नया द्वारा नष्ट किए गए संदर्भ से जुड़ा हुआ है।

क्या मुझे यह अधिकार मिला है? क्या कोई इस बात से विस्तार कर सकता है कि यह कैसे जुड़ा हुआ है? क्या मेरे दृश्य मॉडल को देखने का कोई ज्ञान नहीं है, तो इसे पुन: स्थापित करने का कोई तरीका है?

उत्तर

12

सुनिश्चित करें कि आप अपने संग्रह को पुन: व्यवस्थित करने के बाद एक संपत्तिChangedEvent उठा रहे हैं। इस घटना को बढ़ाने से दृश्य को उस दृश्य के साथ संपत्ति में परिवर्तनों को संभालने की अनुमति मिल जाएगी, जिसमें दृश्य का कोई ज्ञान नहीं है।

class Model : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    private ObservableCollection<string> _list = new ObservableCollection<string>(); 
    public ObservableCollection<string> List 
    { 
     get { return _list; } 
     set 
     { 
      _list = value; 
      NotifyPropertyChanged("List"); 
     } 
    } 

    public Model() 
    { 
     List.Add("why"); 
     List.Add("not"); 
     List.Add("these?"); 
    } 
} 
4

मैं अपने विवरण है कि आप क्या करने की जरूरत है संपत्ति है कि आपके ObservableCollection को उजागर करता है इतना है कि यह एक PropertyChanged घटना भी जन्म देती है, जब यह एक नया मान असाइन किया गया है refactor है के आधार पर लगता है। उदाहरण:

public ObservableCollection<int> Integers 
{ 
    get { return this.integers; } 
    set { 
     if (this.integers != value) 
     { 
      this.integers = value; 
      RaisePropertyChanged("Integers"); 
     } 
    } 
} 
3

जाना चाहिए तुम्हें अपने ViewModel पर INotifyPropertyChanged को क्रियान्वित किया है, आप जब भी यह करने के लिए एक नई मूल्य निर्दिष्ट अपने ObservableCollection पर संपत्ति बदली हुई घटना बढ़ा सकते हैं।

public ObservableCollection<string> MyList { get; set; } 

public void SomeMethod() 
{ 
    MyList = new ObservableCollection<string>(); 
    RaisePropertyChanged("MyList"); 
} 
1

अपडेट ObservableCollection को CollectionChanged घटना में hooking द्वारा नियंत्रित किया जाता है तो जब आप एक नया ObservableCollection अपने पर्यवेक्षक अभी भी पुराने संग्रह में दिख रही है बनाएँ।

दो सरल सुझाव या तो वर्ग कि ObservableCollection और संग्रह संपत्ति के सेटर में PropertyChanged घटना को ऊपर उठाने (भूल जाते हैं अपने पर्यवेक्षक में पहली वर्ष एक से घृणाजनक नहीं है अगर यह होता है पर INotifyPropertyChanged लागू करने के लिए किया जाएगा आपके अपना कोड)।

private ObservableCollection<string> _myCollection = new ObservableCollection<string>(); 
public ObservableCollection<string> MyCollection 
{ 
    get { return _myCollection; } 
    set 
    { 
     if(_myCollection == value) 
      return; 

     _myCollection = value; 
     RaisePropertyChanged("MyCollection"); 
    } 
} 

एक दूसरा, और विकल्प मैं आम तौर पर पसंद करते हैं बस स्पष्ट करने के लिए है और अपने नए डेटा के साथ संग्रह फिर से आबाद है जब यह आता है।

public void HandleCollectionData(IEnumerable<string> incomingData) 
{ 
    MyCollection.Clear(); 
    foreach(var item in incomingData) 
    { 
     MyCollection.Add(item); 
    } 
} 
+2

प्रत्येक आइटम को देखने योग्य संग्रह में जोड़ना यूआई अपडेट राउंड्रिप बढ़ाता है। इसलिए आपको दूसरे समाधान से बचना चाहिए। –

+0

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