c# - ObservableCollection теряет привязку, когда я «новый» его



wpf binding (3)

Обновления ObservableCollection обрабатываются путем подключения к событию CollectionChanged поэтому при создании новой ObservableCollection ваш наблюдатель все еще смотрит на старую коллекцию.

Два простых предложения: либо реализовать INotifyPropertyChanged в классе, который содержит ObservableCollection и вызвать событие PropertyChanged в установщике свойства коллекции (не забудьте сначала отсоединиться от старого в вашем наблюдателе, если это ваш собственный код).

private ObservableCollection<string> _myCollection = new ObservableCollection<string>();
public ObservableCollection<string> MyCollection
{
    get { return _myCollection; }
    set
    {
        if(_myCollection == value)
            return;

        _myCollection = value;
        RaisePropertyChanged("MyCollection");
    }
}

Во-вторых, и вариант, который я обычно предпочитаю, - это просто очистить и снова заполнить коллекцию новыми данными, когда они поступят.

public void HandleCollectionData(IEnumerable<string> incomingData)
{
    MyCollection.Clear();
    foreach(var item in incomingData)
    {
        MyCollection.Add(item);
    }
}

https://code.i-harness.com

У меня есть ListBox на моем пользовательском интерфейсе, который связан со свойством ObservableCollection. Я установил новый экземпляр ObservableCollection в свойстве в конструкторе модели представления, и я могу добавить элементы к нему с помощью кнопки на форме. Они видны в списке.

Все хорошо.

Однако, если я повторно инициализирую свойство с новым в обратном вызове кнопки, оно нарушает привязку и пользовательский интерфейс больше не показывает, что находится в коллекции.

Я предположил, что привязка продолжит искать значения свойства, но, вероятно, связана с ссылкой, которая уничтожается новой .

Я правильно понял? Кто-нибудь может рассказать о том, как это связано? Есть ли способ перепривязать его, когда моя модель представления не знает представление?


Предположим, что вы реализовали INotifyPropertyChanged в своей ViewModel, вы можете вызывать событие изменения свойства в ObservableCollection всякий раз, когда вы назначаете ему новое значение.

public ObservableCollection<string> MyList { get; set; }

public void SomeMethod()
{
    MyList = new ObservableCollection<string>();
    RaisePropertyChanged("MyList");
}

Я думаю, основываясь на вашем описании, что вам нужно сделать рефакторинг свойства, которое предоставляет вашу ObservableCollection, чтобы оно вызывало событие PropertyChanged также, когда ему присваивается новое значение. Пример:

public ObservableCollection<int> Integers
{
    get { return this.integers; }
    set {
        if (this.integers != value)
        {
            this.integers = value;
            RaisePropertyChanged("Integers");
        }
    }
}




binding