使用列表框刷新MVVM的麻烦

时间:2011-03-19 05:38:13

标签: .net wpf xaml data-binding mvvm

好的,学习MVVM让我很生气。我知道这是好的模式,但有时候......

我有简单的图书编目应用程序。首先使用EF代码完成模型。它包含两个表authorsbooks。现在,我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。有没有办法在没有手工刷新的情况下做到这一点? (实际上也不起作用......)

2 个答案:

答案 0 :(得分:1)

要让新作者显示在列表框中,您需要确保:

  • 已设置ListBox的DataContext。如果您已将ViewModel设置为View的DataContext,则可以。
  • Authors属性必须是公共的,并且必须在更改集合时添加NotifyCollectionChanged事件(添加或删除项目)。 ObservableCollection<T>会为您执行此操作。
  • 您创建的新作者对象将添加到Authors集合中。这应该引发NotifyCollectionChanged事件,并且视图应该刷新。

如果您正在执行所有这些操作但仍然没有看到新项目,请检查调试窗口中的绑定错误。

如果它仍然不起作用,您可能需要发布一些代码......

答案 1 :(得分:1)

  

验证后,我单击按钮,新的Author实体将保存到数据库中。然后,我关闭“CreateAuthorWindow”并返回MainWindow。

将新作者保存到数据库是不够的,您需要A)从数据库重新加载作者或B)将新创建的Author对象添加到现有列表中。