如何以适当的方式将网格绑定到基于EF的视图模型?

时间:2015-08-05 16:41:04

标签: c# wpf entity-framework xaml mvvm

我继承了一个项目,其中使用EF 6基于数据库创建数据模型。我按如下方式创建视图模型,其中 Data 是为我的数据库自动生成的类型上下文(即它包含与DB中的表对应的字段)。

public class ViewModel : INotifyPropertyChanged
{
  private Data _data = new Data();

  private ObservableCollection<Order> _orders;
  public ObservableCollection<Order> Orders
  {
    get { return _orders; }
    set
    {
      _orders = value;
      OnPropertyChanged("Orders");
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected virtual void OnPropertyChanged(String propertyName = null)
  {
    var handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
  }
}

在XAML代码中绑定网格不应该很难,只需要我指向属性 Orders 。但是,我不确切地知道如何从数据库中填充属性(我还没有看到任何加载方法),也不知道数据库将如何更新(如果网格值已更改,绑定设置为 TwoWay )。

我用谷歌搜索了它,但没有找到任何正确的信息。建议?

数据在以下类中自动生成。

public partial class Data : DbContext
{
  public Data() : base("name=Data") { }

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    throw new UnintentionalCodeFirstException();
  }

  public virtual IObservable<Order> Orders { get; set; }
}

问题在于,当我创建 Data 的实例时,属性 Orders 似乎是 null 而我不是确定如何填充它。没有方法可以加载,枚举,选择,在哪里等等......它的类型为 IObservable ,而不是 IEumerable 和我无法看到任何 ToList ToEnumerable 方法......

修改

当我尝试将不同的表加载到集合中时,我注意到其中一个是 null ,没有明显的原因。

enter image description here

2 个答案:

答案 0 :(得分:2)

使用Data类,您可以创建一个默认构造函数来设置ViewModel中的Orders属性,如下所示:

public class ViewModel : INotifyPropertyChanged
{
  private Data _data = new Data();

  private ObservableCollection<Order> _orders;
  public ObservableCollection<Order> Orders
  {
    get { return _orders; }
    set
    {
      _orders = value;
      OnPropertyChanged("Orders");
    }
  }

  //define a constructor
  public ViewModel()
  {
    _data.Set<Order>().Load();
    this.Orders=_data.Set<Order>().Local;
  }
 //...
}

LocalDbSet<T>类的一个属性,它获得ObservableCollection<T>代表所有AddedUnchanged和{{的本地视图1}}此集合中的实体。当在上下文中添加或删除实体时,此本地视图将保持同步。同样,添加到本地视图或从本地视图中删除的实体将自动添加到上下文中或从上下文中删除。

现在,由于Modified为您提供了DbSet<TEntity>.Local当前跟踪的对象,您需要首先加载到内存中 - 您需要绑定的实体。这就是首先需要调用DbContext方法,以实现查询的方式。

最后,WPF本身支持绑定到Load所以没有额外的代码需要双向数据绑定,完全支持WPF排序,过滤等

更新1

如果您在ObservableCollection课程中将Orders属性的类型更改为DbSet<Order>,则可以通过以下方式设置ViewModel的Data属性:

Orders

答案 1 :(得分:-1)

  1. 让我们澄清您正在使用DataGrid(而不仅仅是Grid)。如果您添加XAML代码,它将非常有用

  2. 我不知道DataGrid上的任何方法,通常你可以在构造函数或内部属性中填充集合

    公共ObservableCollection订单
    {
        得到{
            if(_orders == null){//在此处填写订单}
            return _orders; }
        组     {         _orders = value;
            OnPropertyChanged(&#34;订单&#34);     }
    }

  3. 要保存更改,您可以查看此post