EF Code First绑定到列表框

时间:2011-09-23 11:40:09

标签: wpf entity-framework data-binding mvvm

如果有人能告诉我如何将列表框绑定到实体框架(首先是EF代码),我将不胜感激。

我正在使用棱镜和mef。有两个视图,一个带有按钮,另一个带有列表框。 (每个都在自己的棱镜区域)。 通过单击按钮,我创建了一个新的Employee对象,并通过实体框架将其插入到数据库中。

问题是我的列表框没有显示列表中新添加的Employee对象。应该做些什么来改变它?

代码的某些部分:

的MainView:

    <Grid>
    <StackPanel>
        <TextBlock Text="Hello From MainView (Core Module)" />
        <ListBox ItemsSource="{Binding Employees, Mode=TwoWay}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding FirstName}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</Grid>

MainViewModel:

namespace EmployeeViewer.Core.ViewModels
{
  [Export]
  [PartCreationPolicy(CreationPolicy.NonShared)]
  public class MainViewModel : NotificationObject
  {
    private IUnitOfWork _UnitOfWork;

[ImportingConstructor]
public MainViewModel(IUnitOfWork unitOfWork) // IEventAggregator eventAggregator
{
  this._UnitOfWork = unitOfWork;

  Init();
}

private void Init()
{
  this.Employees = new ObservableCollection<Employee>(_UnitOfWork.EmployeeRepository.Get());
  //this.Employees = new BindingList<Employee>(_UnitOfWork.EmployeeRepository.Get().ToList());
}

public ObservableCollection<Employee> Employees { get; set; }
//public BindingList<Employee> Employees { get; set; }

} }

从GenericRepository获取方法:

    public virtual IEnumerable<TEntity> Get(
  Expression<Func<TEntity, bool>> filter = null,
  Func<IQueryable<TEntity>,
  IOrderedQueryable<TEntity>> orderBy = null,
  string includeProperties = "")
{
  IQueryable<TEntity> query = _DbSet;

  if (filter != null)
  {
    query = query.Where(filter);
  }

  foreach (var includeProperty in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
  {
    query = query.Include(includeProperty);
  }

  if (orderBy != null)
  {
    return orderBy(query).AsEnumerable();//.ToList();
  }
  else
  {
    return query.AsEnumerable();//.ToList();
  }
}

通过ICommand(在RelayCommand中实现)在另一个区域并查看,我首先创建一个新的Employee对象并将其插入到Entity Framework代码中。

public ICommand AddEmployeeCommand
{
  get { return _AddEmployeeCommand; }
}

private void AddEmployee()
{
  _UnitOfWork.EmployeeRepository.Insert(new Employee() { FirstName = "Test", LastName = "Via cmd" });
  _UnitOfWork.Save();
}

2 个答案:

答案 0 :(得分:4)

Bing.com上搜索后,我发现EF有本地属性。

如果您正在寻找解决方案,我就是这样做的:

我在GenericRepository中添加了一个新方法:

public virtual ObservableCollection<TEntity> GetSyncedEntityItems()
{
  return _DbSet.Local;
}

这是最重要的部分:.Local 为您提供一个与EF同步的ObservableCollection!

在我的ViewModel中,我这样做:

this.Employees = _UnitOfWork.EmployeeRepository.GetSyncedEntityItems();

向EF添加新员工将导致我的其他视图更新:

private void AddEmployee()
{
  _UnitOfWork.EmployeeRepository.Insert(new Employee() { FirstName = "Test", LastName = "Via cmd" });
  _UnitOfWork.Save();
}

我不知道这是否是最好的解决方案,如果有更好的选择,请告诉我!

答案 1 :(得分:1)

你需要触发INotifyPropertyChanged.PropertyChanged,我假设NotificationObject有一个很好的方法来做到这一点。

当您的Employees属性从null转到包含项目的列表时,您的View需要得到通知,以便它可以更新。

一旦Employees属性不为null,添加的新项将自动更新View(ObservableCollection的b / c)。