【问题标题】:MVVM updating ListView when a new item is added via another view当通过另一个视图添加新项目时,MVVM 更新 ListView
【发布时间】:2017-10-22 12:14:45
【问题描述】:

情况就是这样。我有一个带有 MVVM 的 WPF 项目。让我试着解释一下..

PersonView.xaml 显示了一个包含所有人员的 ListView,在此 View 后面是 ViewModel PersonViewModel.cs。这里 ListView PersonList 被填满了。

PersonView.xaml 上还有一个按钮,用于打开另一个 View,NewPersonView.xaml,其后面带有 ViewModel NewPersonViewModel.cs

当我单击 NewPersonView.xaml 上的保存按钮时,如何刷新 PersonView.xaml 上的 ListView,以便添加新的 Person 时?

如果需要,我可以提供代码吗?

编辑:当我添加一个新人时,它会将其保存在 sql 数据库中。

【问题讨论】:

  • 如果您的 ListView 绑定到 ObservableCollection,将自动发生。如果它不适合您,那么您需要提供您的代码,以便我们找出问题所在。
  • 它们必须共享完全相同的视图模型。

标签: wpf listview mvvm refresh


【解决方案1】:

一种方法是在初始化时将一个 Action 传递给您的 NewPersonViewModel:

private void AddPerson(Person per) {
    PersonList.Add(per);
    NotifyOfPropertyChange(() => PersonList); // this wont be needed if you use ObservableCollection
}

NewPersonViewModel.Initialize:

private Action<Person> _addPersonAction;

Initialize(Action<Person> addPersonAction) {
    _addPersonAction = addPersonAction;
}

如果你想添加一个人,你可以调用这个动作。

编辑:

如果你不使用 IoC,你可以这样做: (伪代码)

  1. 在您的 PersonView.xaml.cs 中添加类似 Button_OnClick 的事件方法
  2. var view = new NewPersonView();
  3. ((NewPersonViewModel)view.DataContext).Initialize(((PersonViewModel)DataContext).AddPerson); 显然 AddPerson 必须是公众的。

这个解决方案不干净,但应该可以,我推荐使用城堡温莎 IoC。

编辑 2:

如果您想在数据库中保存更改,您可以执行以下操作:PersonList.CollectionChanged += ... 然后使用 e.NewItems 查找您必须添加到数据库的项目并使用 e.OldItems 查找要删除的项目。

在您的 PersonViewModel 中执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多