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

  • Chilla Frilla™

    Chilla Frill

    7 Aralık 2006
  • Curso Online Gratuito

    Curso Online

    4 Aralık 2011
  • Skrillex

    Skrillex

    6 NİSAN 2010