Хорошо, после вчерашнего дня я добавил новый уровень сложности. У нас все еще есть теоретический класс Model, ViewModel и View. На этот раз моя модель имеет Threading.Timer (выбранный специально для получения обратных вызовов таймера в «неправильном» потоке.
Модель имеет коллекцию ObservableCollection. Обратный вызов Timer добавляет элементы в коллекцию.
ViewModel просто передает коллекцию представлению, которое содержит список, связанный с коллекцией.
Это не работает.
Модель также предоставляет строку, которая обновляется в том же обратном вызове таймера.
Это также доступно через viewmodel и привязано к TextBox.
Это работает.
Я видел подсказки в моем поиске, что обновление коллекций не дает INotifyCollectionChanged работать должным образом. Я получаю полный взрыв, даже не исключение, просто немедленное прекращение приложения.
Итак, есть два вопроса:
Один относится к нашей вчерашней дискуссии. Я использую INotifyPropertyChanged и ObservableCollections в моей модели, потому что они - вещь, над которой работает представление. Для меня все еще имеет смысл использовать эти механизмы для уведомления моей модели представления, или чего бы то ни было, что базовая модель изменилась. Итак, как мне поступить с обновлениями, происходящими в другом потоке?
Во-вторых, что происходит, что заставляет INotifyPropertyChanged работать с привязкой? Я связываю строковое свойство с DependencyProperty с именем Text, поэтому система DependencyProperty отправляет мои изменения обратно в поток пользовательского интерфейса? Изменить: И могу ли я положиться на это, то есть делает ли это это, потому что они ожидают, что я буду говорить с ним сквозь нить, или это просто ловушка все, на что я не должен полагаться?
ListBox связан через ItemsSource = "{Binding ObsCollection}". При этом вылетает приложение. На самом деле, сначала я запустил таймер, когда создавалась Модель, что происходило, когда был задан DataContext в Window, поэтому он фактически бомбил Visual Studio ...
Спасибо