如果有人能告诉我如何将列表框绑定到实体框架(首先是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();
}
答案 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)。