我有一个带有某些属性的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
事物)会导致问题。
答案 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概念)。