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

  • Amir Parmar

    Amir Parmar

    25 Kasım 2010
  • Hak5DarrensVlog

    Hak5DarrensV

    11 EYLÜL 2009
  • humanHardDrive

    humanHardDri

    16 Mart 2011