SORU
15 EYLÜL 2009, Salı


ObservableCollection bu Madde değiştiğinde değil fark (bile)INotifyPropertyChanged

herkes bu kod neden çalışmıyor: biliyor mu

public class CollectionViewModel : ViewModelBase {  
    public ObservableCollection<EntityViewModel> ContentList
    {
        get { return _contentList; }
        set 
        { 
            _contentList = value; 
            RaisePropertyChanged("ContentList"); 
            //I want to be notified here when something changes..?
            //debugger doesn't stop here when IsRowChecked is toggled
        }
     }
}

public class EntityViewModel : ViewModelBase
{

    private bool _isRowChecked;

    public bool IsRowChecked
    {
        get { return _isRowChecked; }
        set { _isRowChecked = value; RaisePropertyChanged("IsRowChecked"); }
    }
}

PS: ViewModelBase containts RaisePropertyChanged vb her şey. ve bu sorun başka.. her şey için işe yarıyor

CEVAP
10 Mart 2011, PERŞEMBE


-Tüm sınıflar alt ObservableCollection ve bir liste öğesi üzerinde bir özellik değiştiğinde aslında bir Reset eylem başlatan açılan bir sınıf. Tüm öğeleri INotifyPropertyChanged uygulamak için zorlar.

Burada parası bu sınıf için veri bağlama olabilir ve tüm bağlantıları maddenin özelliklerini değişiklikleri ile güncellenir.

public sealed class TrulyObservableCollection<T> : ObservableCollection<T>
    where T : INotifyPropertyChanged
{
    public TrulyObservableCollection()
    {
        CollectionChanged  = FullObservableCollectionCollectionChanged;
    }

    public TrulyObservableCollection(IEnumerable<T> pItems) : this()
    {
        foreach (var item in pItems)
        {
            this.Add(item);
        }
    }

    private void FullObservableCollectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                ((INotifyPropertyChanged)item).PropertyChanged  = ItemPropertyChanged;
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                ((INotifyPropertyChanged)item).PropertyChanged -= ItemPropertyChanged;
            }
        }
    }

    private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
    {            
        NotifyCollectionChangedEventArgs args = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, sender, sender, IndexOf((T)sender));
        OnCollectionChanged(args);
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DragsterMC Gaming

    DragsterMC G

    30 HAZİRAN 2013
  • Jana Williams

    Jana William

    17 AĞUSTOS 2011
  • Mark Hyder

    Mark Hyder

    6 EKİM 2011