2010-06-15 24 views
5

संग्रहित घटना निम्न कोड में क्यों नहीं आती है, फिर भी मैं इनवेंटरी बीटीओ का नया उदाहरण देख सकता हूं जिसे मैं पर्यवेक्षण चयन में जोड़ता हूं?अवलोकन योग्य चयन और संग्रह परिवर्तनित घटना

private ObservableCollection<InventoryBTO> _inventoryRecords; 
    public ObservableCollection<InventoryBTO> InventoryRecords 
    { 
     get { return _inventoryRecords; } 
     set { _inventoryRecords = value; } 
    } 

    private InventoryBTO _selectedRecord; 
    public InventoryBTO SelectedRecord 
    { 
     get { return _selectedRecord; } 
     set 
     { 
      if (_selectedRecord != value) 
      { 
       _selectedRecord = value; 
       OnPropertyChanged(new PropertyChangedEventArgs("SelectedRecord")); 
      } 
     } 
    } 

    public InventoryViewModel() 
    { 
     if (_inventoryRecords == null) 
     { 
      InventoryRecords = new ObservableCollection<InventoryBTO>(); 
      this.InventoryRecords.CollectionChanged += new NotifyCollectionChangedEventHandler(InventoryRecords_CollectionChanged); 
     } 

     _inventoryRecords = InventoryListBTO.GetAllInventoryRecords(); 
    } 

    void InventoryRecords_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 

    } 
+1

लग रहा है एक पूरी तरह से अलग संग्रह के साथ संदर्भ ओवरराइट करें। शायद आप ओवरराइटिंग के बजाय AddRange करना चाहते थे? किसी भी तरह से, आपके द्वारा बनाए गए अवलोकन संग्रह और फिर लंबे समय तक –

उत्तर

10

समस्या यह है कि आप अपने निजी सदस्य को ObservableCollection के नए उदाहरण में असाइन कर रहे हैं कि आप अपनी विधि से वापस आ रहे हैं। इसलिए, क्या हो रहा है, एक संग्रह की स्थिति में आपका हुकिंग है, लेकिन फिर उस इंस्टेंस को दूर कर रहा है और इसे एक नए इंस्टेंस के साथ बदल रहा है, आपने कभी इवेंट हैंडलर को कभी नहीं जोड़ा। यहां आप क्या कर सकते हैं। एक वर्ग है कि ObservableCollection से विरासत और एक AddRange विधि कहते हैं बनाएं: फिर

public class RangeObservableCollection<T> : ObservableCollection<T> 
{ 
    private bool surpressEvents = false; 

    public void AddRange(IEnumerable<T> items) 
    { 
     surpressEvents = true; 
     foreach (var item in items) 
     { 
      base.Add(item); 
     } 
     this.surpressEvents = false; 
     this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, items.ToList())); 

    } 

    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     if (!this.surpressEvents) 
     { 
      base.OnCollectionChanged(e); 
     } 
    } 
} 

, तो आप इस के लिए अपने वर्ग बदल सकते हैं: जैसे आप तुरंत अपने ctor में संग्रह करने के लिए ऊपर हुक और फिर

private RangeObservableCollection<InventoryBTO> _inventoryRecords; 
public RangeObservableCollection<InventoryBTO> InventoryRecords 
{ 
    get { return _inventoryRecords; } 
    set { _inventoryRecords = value; } 
} 

private InventoryBTO _selectedRecord; 
public InventoryBTO SelectedRecord 
{ 
    get { return _selectedRecord; } 
    set 
    { 
     if (_selectedRecord != value) 
     { 
      _selectedRecord = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("SelectedRecord")); 
     } 
    } 
} 

public InventoryViewModel() 
{ 
    if (_inventoryRecords == null) 
    { 
     InventoryRecords = new ObservableCollection<InventoryBTO>(); 
     this.InventoryRecords.CollectionChanged += new NotifyCollectionChangedEventHandler(InventoryRecords_CollectionChanged); 
    } 

    this.InventoryRecords.AddRange(InventoryListBTO.GetAllInventoryRecords()); 
} 

void InventoryRecords_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    //e.NewItems will be an IList of all the items that were added in the AddRange method... 
} 
+0

पहली पंक्ति मेरी समस्या के बारे में इंगित करती है। इसलिए मैंने संपत्ति के सेटटर पर संग्रह चेंज इवेंट हैंडलर जोड़ा। –

0

आपके क्रियान्वयन के आधार इस

public ObservableCollection<InventoryBTO> InventoryRecords 
{ 
    get { return _inventoryRecords; } 
    set 
    { 
     _inventoryRecords = value; 
     onPropertyChanged(this, "InventoryRecords"); 

    } 
} 

या

public ObservableCollection<InventoryBTO> InventoryRecords 
{ 
    get { return _inventoryRecords; } 
    set 
    { 
     _inventoryRecords = value; 
     OnPropertyChanged(new PropertyChangedEventArgs("InventoryRecords")); 

    } 
} 

की कोशिश करो।

+0

चला जाता है जब भी कोई संपत्ति किसी संपत्ति पर सेट की जाती है, तो विधि "ऑनप्रॉपर्टी चेंज" कहा जाएगा, जो बदले में प्रॉपर्टी चेंज इवेंट उठाएगा। – VoodooChild

+0

मुझे समझ में नहीं आता है। जब कोई नया इन्वेंटरी बीटीओ जोड़ा जाता है तो PropertyChanged Event संग्रह की संग्रहित घटना को कैसे प्रभावित करता है? – user337816

+0

इसके अलावा संग्रह संग्रह के अंदर गुणों को कैसे बदल दिया जाएगा जिसमें नए आइटम जोड़े गए हैं। – user337816

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