wpf 使用ViewModel类的不同示例可能会导致更新ObservableCollection?时出现问题,

62lalag4  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(167)

我有一个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的事情),是导致问题的原因。

fae0ux8s

fae0ux8s1#

好吧,我可以解决它。不确定我是否表达得很好,但它就像我在修改不同的数据源(即数据上下文)。所以,我所做的是尝试将子UserControl的数据上下文强制转换为BookViewModel(其父UserControl的数据上下文),并从该数据上下文开始工作:

// 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的概念)。

相关问题