使用ViewModel类的不同实例会导致更新ObservableCollection的问题?

时间:2018-10-04 08:14:55

标签: c# wpf observablecollection

我有一个带有某些属性的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 :(得分:0)

好的,我可以解决。不知道我是否表现得很好,但这就像我在修改不同的数据源(即数据上下文)一样。因此,我所做的就是尝试将子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);
}

仅此而已。完美更新。在代码的任何部分(甚至在构造函数中),我都不会做任何与数据文本或视图模型有关的事情。现在,就好像我要在父级的同一数据上下文中修改数据一样(抱歉,如果我的解释不准确,我仍然会习惯于WPF概念)。