【问题标题】:Trouble in MVVM with listbox refreshing列表框刷新的 MVVM 出现问题
【发布时间】:2011-03-19 05:38:13
【问题描述】:

好吧,学习 MVVM 让我发疯。我知道这是很好的模式,我知道,但有时......

我有一个简单的图书编目应用程序。首先使用 EF 代码完成模型。它包含两个表authorsbooks。现在,我有MainWindow,后面有MainWindowViewModel。在 MainWindow 中,我有一个绑定到 ViewModel 的列表框,如下所示:

<ListBox ItemContainerStyle="{DynamicResource ListBoxItemStyle1}"
ItemsSource="{Binding Authors, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
DisplayMemberPath="Fullname"Name="AuthorsListBox" sSynchronizedWithCurrentItem="True"/>

在我的 DataContext (ViewModel) 中,“作者”是 ObservableCollection&lt;Author&gt;。目前一切似乎都很好。问题是:

我正在打开新窗口,简直太简单了,只有两个文本框和按钮来创建新作者

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

列表框中没有显示新的实体。我不能让它显示!我模型中的所有内容都实现了INotifyPropertyChanged。有没有办法做到这一点而不用手刷新? (实际上也不起作用......)

【问题讨论】:

  • 您确定已将新作者添加到您的 ObservableCollection 中吗?在该集合的 INotifyPropertyChanged 上放置一个处理程序,并弹出一个消息框以检查该事件是否已触发以及它触发的属性名称。
  • 我相信 ObservableColleciton 应该在“Count”和“Items”属性上触发 INotifyPropertyChange 事件,如果正在更改集合。
  • @Stephen Chung - 不完全;根据我的回答,它实际上会触发 NotifyCollectionChanged 事件:)
  • 当您在 Visual Studion 的调试器中运行它时,打开输出窗口并查找数据绑定错误 - 有时您会犯什么错误令人惊讶。
  • @IanR,我不认为数据绑定使用来自 INotifyCollectionChanged 接口的 CollectionChanged 事件。它使用 ObservableCollection 也实现的 INotifyPropertyChanged 事件中的 PropertyChanged 事件。但不确定项目集合——它也可能作用于 INotifyCollectionChanged。

标签: .net wpf xaml data-binding mvvm


【解决方案1】:

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

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

【讨论】:

  • 你是对的。我认为 ObservableCollection 将与数据库保持同步,但事实并非如此。我已经通过 MVVM Light 工具包中的 Messenger 类完成了它。谢谢!
【解决方案2】:

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

  • ListBox 的 DataContext 已设置。如果您已将 ViewModel 设置为 View 的 DataContext,那就没问题了。
  • Authors 属性必须是公共的,并且必须在集合更改(添加或删除项目)时引发 NotifyCollectionChanged 事件。 ObservableCollection&lt;T&gt; 将为您完成这项工作。
  • 您创建的新作者对象被添加到 Authors 集合中。这应该引发NotifyCollectionChanged 事件,并且视图应该刷新。

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

如果还是不行,你可能需要发布一些代码...

【讨论】:

  • 您还需要确保在 UI 线程上修改了 Authors 集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多