1

我快要发疯了。

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

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

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

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

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

4

1 回答 1

1

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

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

视图模型

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

于 2013-04-15T05:36:18.223 回答