【问题标题】:A simpel WPS using MVVM and EF使用 MVVM 和 EF 的简单 WPF
【发布时间】:2013-04-15 03:34:36
【问题描述】:

我快要发疯了。

我有一个正在工作的 WinForms/数据库应用程序,我尝试使用 WPF 重建它。我的主要问题是我以前没有使用过 MVVM,而且我似乎无法掌握从实体框架到视图的数据绑定。

我的 WinForms 是专门使用代码隐藏构建的,我知道这是不好的做法,但它确实有效。 我已经阅读了大约 100 篇文章、教程和示例,下载了几个使用 MVVM 的演示/示例。包括“WPF应用框架(WAF)”

但我还没有找到一个简单的解决方案/示例,如何将 EF 用作模型或模型的数据提供者。并将信息传递给 ViewModel,最后从 View 中绑定。

我读过的所有教程都只描述了从静态列表中获取数据,我需要对数据库进行常规的 CRUD 操作。

我知道这里一直有人问这样的问题,但我无法找到将数据从 EF 推送到视图(模型)并通过 EF 更新回来的答案。我希望你们中的一些人可以帮助像我这样的(一定是智障的)人一些指导。

【问题讨论】:

  • 我觉得你很痛苦。这对我也有帮助!

标签: wpf database entity-framework mvvm


【解决方案1】:

MVVM 模式很大程度上取决于 EF 实现的 INotifyPropertyChanged 接口,因此这里的一些工作已经为您完成。

我不太确定您的特定要求,但首先要为您的窗口创建一个视图模式。假设您有一个名为 Person 的实体,其属性为 FirstName 作为字符串,Id 为 Int32(当然),并且数据层的所有工作都已处理。我将向您展示如何列出 Person 实体并允许编辑 person 实体。

视图模型

public class Window1ViewModel : INotifyPropertyChanged {
  public event PropertyChangedEventHandler PropertyChanged;

  private ObservableCollection<Person> _people;
  private Person _selectedPerson;

  public ObservableCollection<Person> People {
    get { return _people; }
    set { _people = value;
      this.RaisePropertyChanged("People");
    }
  }

  public Person SelectedPerson {
    get { return _selectedPerson; }
    set { _selectedPerson = value;
      this.RaisePropertyChanged("SelectedPerson");
  }

  public Window1ViewModel() {
    // Instead of setting to empty collection populate with data from EF.
    this.People = new ObservableCollection<Person>();
  }

  private void RaisePropertyChanged(string propertyName) {
    if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}

现在您已经处理好 ViewModel,是时候创建 UI 并绑定它了。

绑定列表框

<ListBox ItemsSource="{Binding Source={StaticResource viewModel}, Path=People}" SelectedItem="{Binding Source={StaticResource viewModel}, Path=SelectedPerson, Mode=TwoWay}"/>

绑定文本框

<TextBox Text="{Binding Source={StaticResource viewModel}, Path=SelectedPerson.FirstName, Mode=TwoWay}"/>

最后,您可以在 Window 上创建一个按钮,将其绑定到 ViewModel 上的 ICommand 以调用 EF 层中的 Save() 方法。

您可以写很多内容来满足您的要求,我希望这对您有所帮助。还推荐以下信息。 http://www.codeproject.com/Articles/81484/A-Practical-Quick-start-Tutorial-on-MVVM-in-WPF

【讨论】:

  • 我可以用this.People = db.Person(p =&gt; p.FirstName == "John")之类的东西填写这个吗?
  • 列表视图的绑定方式是否与列表框相同?
  • 抱歉耽搁了。是的,您确实可以如上所述进行填充。我建议您在逻辑层中编写一个 Manager 类来处理人员的负载。这样你填充 this.People = new ObervableCollection(manager.getPeople("John"));
  • 填充列表框和填充列表视图是完全一样的。列表框或列表框或任何枚举控件绑定到 ObservableCollection。
  • Damm** 现在我得到 无法将类型 'System.Linq.IOrderedQueryable' 隐式转换为 'System.Collections.ObjectModel.ObservableCollection' .存在显式转换(您是否缺少演员表?) 使用以下代码 ObservableCollection&lt;KLS_APP_VKLS_DETALJE&gt; klsOversigt = db.KLS_APP_VKLS_DETALJE.Where(vk =&gt; App.ConnRoles.Contains(vk.SAGSTYPE_ROLLE))
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多