好的,学习MVVM让我很生气。我知道这是好的模式,但有时候......
我有简单的图书编目应用程序。首先使用EF代码完成模型。它包含两个表authors
和books
。现在,我MainWindow
背后有MainWindowViewModel
。在MainWindow中,我有一个绑定到ViewModel的Listbox,如下所示:
<ListBox ItemContainerStyle="{DynamicResource ListBoxItemStyle1}"
ItemsSource="{Binding Authors, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Fullname"Name="AuthorsListBox" sSynchronizedWithCurrentItem="True"/>
我的DataContext(ViewModel)中的“作者”是ObservableCollection<Author>
。现在一切似乎都很好。出了什么问题:
我正在打开新窗口,简单如地狱,只有两个文本框和按钮来创建新作者
验证后,我单击按钮,新的Author实体将保存到数据库中。然后,我关闭"CreateAuthorWindow"
并返回MainWindow
。
列表框中显示新的无实体。我无法得到它!我的模型中的所有内容都实现了INotifyPropertyChanged
。有没有办法在没有手工刷新的情况下做到这一点? (实际上也不起作用......)
答案 0 :(得分:1)
要让新作者显示在列表框中,您需要确保:
ListBox
的DataContext。如果您已将ViewModel设置为View的DataContext,则可以。Authors
属性必须是公共的,并且必须在更改集合时添加NotifyCollectionChanged事件(添加或删除项目)。 ObservableCollection<T>
会为您执行此操作。NotifyCollectionChanged
事件,并且视图应该刷新。如果您正在执行所有这些操作但仍然没有看到新项目,请检查调试窗口中的绑定错误。
如果它仍然不起作用,您可能需要发布一些代码......
答案 1 :(得分:1)
验证后,我单击按钮,新的Author实体将保存到数据库中。然后,我关闭“CreateAuthorWindow”并返回MainWindow。
将新作者保存到数据库是不够的,您需要A)从数据库重新加载作者或B)将新创建的Author对象添加到现有列表中。