2011-09-23 6 views
1

リストボックスをエンティティフレームワーク(EFコード)にバインドする方法を教えてもらえれば分かります。EFコードリストボックスへの最初のバインド

私はプリズムとmefを使用しています。ボタンとリストボックスの2つのビューがあります。 (各自のプリズム領域内にある)。 ボタンをクリックすると、新しい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から取得方法:ICommandの(RelayCommandとして実装)は、別の領域とビューでビア

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(); 
    } 
} 

は、私が作成し、最初のEntity Frameworkのコードに新しい従業員オブジェクトを挿入します。

public ICommand AddEmployeeCommand 
{ 
    get { return _AddEmployeeCommand; } 
} 

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

答えて

4

Bing.comで検索したところ、EFにはローカルというプロパティがあります。あなたはここに解決策を探している場合は

は私がやったことです:これは最も重要な部分である

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

:.LOCALが与え

私は私のGenericRepositoryに新しいメソッドを追加しました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

あなたは、私がNotificationObjectはそれを行うための良い方法を持っているだろうと仮定し、INotifyPropertyChanged.PropertyChangedを発射する必要があります。

Employeesプロパティがヌルからアイテムのリストに移行するとき、ビューに更新ができるように通知する必要があります。

Employeesプロパティがnullでない場合、新しいアイテムが追加されると自動的にView(ObservableCollectionのb/c)が更新されます。

+0

ObservableCollectionは、EF経由でアイテムが追加されたことを自動的に通知されますか? ListBoxプロパティまたはEmployeesプロパティに新しいオブジェクトを追加することはできません。別のビュー(別の.dllファイルなど)にあるためです。 – juFo

+0

従業員リポジトリへの追加は、ObservableCollectionに自動的に追加されません。 ObservableCollectionに使用するコンストラクタは、単なるコピーメカニズムです。 – jonathanpeppers

+0

他にも追加できますか?ボタンが存在するビュー/ビューモデルでは、Employeesプロパティまたはリストボックスにアクセスするために、他のビュー/ビューモデルへのアクセス権がありません。 これを行う方法に関するご提案はありますか? – juFo

関連する問題