我有一个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条答案
按热度按时间fae0ux8s1#
好吧,我可以解决它。不确定我是否表达得很好,但它就像我在修改不同的数据源(即数据上下文)。所以,我所做的是尝试将子UserControl的数据上下文强制转换为
BookViewModel
(其父UserControl的数据上下文),并从该数据上下文开始工作:这就是全部。完美更新。我没有在代码的任何部分(甚至在构造函数中)对相关数据dontext或视图模型做任何事情。现在,就像我在父级的同一数据上下文中修改数据一样(抱歉,如果我的解释不精确,我仍然在习惯WPF的概念)。