Код EF Первая привязка к списку - PullRequest
1 голос
/ 23 сентября 2011

Буду признателен, если кто-нибудь скажет мне, как связать список со структурой сущностей (сначала код 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 ]

4 голосов
/ 23 сентября 2011

После поиска на Bing.com я обнаружил, что EF имеет свойство Local .

Если вы ищете решение, вот что я сделал:

Я добавил новый метод в свой GenericRepository:

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

Это самая важная часть: .Local дает вам ObservableCollection, которая синхронизируется сEF!.

В моей ViewModel я делаю это:

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

И добавление нового сотрудника в EF приведет к обновлению моего другого представления:

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

Я не знаю, является ли это лучшим решением, если есть лучшие варианты, пожалуйста, дайте мне знать!

1 голос
/ 23 сентября 2011

Вам нужно запустить INotifyPropertyChanged.PropertyChanged, я предполагаю, что NotificationObject будет иметь хороший способ сделать это.

Когда ваше свойство Employees переходит от нуля к списку с элементами, ваше представление должно быть уведомлено, поэтомуможно обновить.

Если свойство Employees не равно NULL, добавленные новые элементы автоматически обновят представление (b / c ObservableCollection).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...