ObservableCollection, не замечающий, когда Объект в нем изменения (даже с INotifyPropertyChanged)

Самым близким, который Вы получаете к этому, является очень ограниченный stackalloc оператор.

158
задан Robert Harvey 1 March 2018 в 16:58
поделиться

2 ответа

Метод ContentList Set не получит вызывается, когда вы изменяете значение внутри коллекции, вместо этого вы должны следить за срабатыванием события CollectionChanged .

public class CollectionViewModel : ViewModelBase
{          
    public ObservableCollection<EntityViewModel> ContentList
    {
        get { return _contentList; }
    }

    public CollectionViewModel()
    {
         _contentList = new ObservableCollection<EntityViewModel>();
         _contentList.CollectionChanged += ContentCollectionChanged;
    }

    public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        //This will get called when the collection is changed
    }
}

Хорошо, это дважды сегодня меня укусила неправильная документация MSDN. В ссылке, которую я вам дал, сказано:

Происходит, когда элемент добавляется, удаляется, изменен, перемещен или весь список

Но на самом деле не срабатывает при изменении элемента. Думаю, вам понадобится более грубый метод:

public class CollectionViewModel : ViewModelBase
{          
    public ObservableCollection<EntityViewModel> ContentList
    {
        get { return _contentList; }
    }

    public CollectionViewModel()
    {
         _contentList = new ObservableCollection<EntityViewModel>();
         _contentList.CollectionChanged += ContentCollectionChanged;
    }

    public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            foreach(EntityViewModel item in e.OldItems)
            {
                //Removed items
                item.PropertyChanged -= EntityViewModelPropertyChanged;
            }
        }
        else if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach(EntityViewModel item in e.NewItems)
            {
                //Added items
                item.PropertyChanged += EntityViewModelPropertyChanged;
            }     
        }       
    }

    public void EntityViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        //This will get called when the property of an object inside the collection changes
    }
}

Если он вам очень понадобится, вы можете создать подкласс своего собственного ObservableCollection , который запускает событие CollectionChanged , когда член автоматически запускает событие PropertyChanged (как сказано в документации ...)

116
ответ дан 23 November 2019 в 21:39
поделиться

ObservableCollection не будет распространять изменения отдельных элементов как события CollectionChanged. Вам нужно будет либо подписаться на каждое событие и пересылать его вручную, либо вы можете воспользоваться классом BindingList [T] , который сделает это за вас.

10
ответ дан 23 November 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: