Использование разных экземпляров класса ViewModel может вызвать проблемы с обновлением ObservableCollection? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть класс BookViewModel с некоторыми свойствами, одним из которых является ObservableCollection.Но у меня проблемы с обновлением его значения.Это мой случай:

public class BookViewModel : INotifyPropertyChanged
    {

        private IEnumerable<Book> booksList;

        private ObservableCollection<Chapter> selectedChapters = new ObservableCollection<Chapter>();

        public BookViewModel()
        {
        }

        public BookViewModel(List<Book> booksList)
        {
            this.BooksList = booksList;
        }

    // ...

    public ObservableCollection<Book> SelectedChapters
        {
            get
            {
                return this.selectedChapters;
            }

            set
            {
                this.selectedChapters = value;
                this.OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
}

В одном UserControl моего приложения я делаю:

private TrainViewModel booksViewModel;
// ...
booksViewModel = new BookViewModel(booksList);  // booksList comes from other site
this.DataContext = this.booksViewModel;

И в другом UserControl, который создается динамически как дочерний элемент из предыдущего UserControl я делаю:

private TrainViewModel booksViewModel;
// ...
booksViewModel = new BookViewModel();
this.DataContext = this.booksViewModel; // Different constructor

На этой последней странице у меня есть несколько флажков, которые изменяют мое свойство selectedChapters, добавляя или удаляя из него элементы:

// When some checkbox is checked
this.booksViewModel.SelectedChapters.Add(selectedChapter);
// When some checkbox is unchecked
this.booksViewModel.SelectedChapters.Remove(selectedChapter);

Если каждый раз, когда флажок установлен или снят, я делаю:

Debug.Print(this.booksViewModel.SelectedChapters.Count());  // Always print out 1!!

Мне интересно, вызывает ли проблема использование одного и того же ViewModel, но с разными экземплярами в каждом представлении (вещь new),.

1 Ответ

0 голосов
/ 04 октября 2018

Хорошо, я мог бы решить это.Не уверен, хорошо ли я выражаюсь, но я словно модифицировал разные источники данных (например, контексты данных).Итак, я попытался преобразовать контекст данных дочернего UserControl в BookViewModel (который является контекстом данных его родителя) и работать с этим:

// Inside the event handler for check and uncheck
BookViewModel bookViewModel = this.DataContext as BookViewModel;

// When some checkbox is checked
if (bookViewModel != null){
    this.booksViewModel.SelectedChapters.Add(selectedChapter);
}

// When some checkbox is unchecked
if (bookViewModel != null){
    this.booksViewModel.SelectedChapters.Remove(selectedChapter);
}

И это все.Обновление отлично.Я ничего не делаю со связанными с dontext данными или моделью представления в любой части кода (даже в конструкторе).Теперь я словно изменяю данные в том же контексте данных, что и родительский (извините, если мое объяснение не точное, я все еще привыкаю к ​​концепциям WPF).

...