2013-06-24 3 views
1

Я использую библиотеку EntityFramework в своем приложении WPF, и у меня возникает следующая проблема: Я использую шаблон MVVM (насколько мне известно), и я пытаюсь сделать Combobox Lookup со значениями EF.WPF Combobox Entity Framework Binding (MVVM)

  • У меня есть класс компании, которая содержит много офисов (класс а)
  • Это было смоделировано через EntityFramework и все ссылки являются правильными (Office имеет CompanyName, который является внешним ключом).

Вот класс OfficeView:

public partial class AddOffice : Window 
{ 
    private DBHelper.ResourceManagementContext context = new DBHelper.ResourceManagementContext(); 
    public AddOffice() 
    { 
     InitializeComponent(); 
     context.Companies.Load(); 
     this.DataContext = context.Companies.Local; 
     //this.DataContext = new AddOfficeViewModel(); 
    } 

    public void CloseCommandHandler(object sender, ExecutedRoutedEventArgs e) 
    { 
     this.Close(); 
    } 
} 

Вот соответствующий XAML:

<Label Grid.Row="4" Grid.Column="0" Margin="10,10">Company:</Label> 
    <ComboBox Grid.Row="4" Grid.Column="1" Margin="10,10" 
       ItemsSource="{Binding}" 
       DisplayMemberPath="CompanyName" 
       SelectedValuePath="CompanyName" 
       SelectedValue="{Binding Path=CompanyName}"/> 

Я знаю, что шаблон MVVM обычно проходит ViewModel к просмотру, так как я бы выполнить привязку список EntityFramework Company в ComboBox с помощью OfficeViewModel?

Я понимаю свойства ComboBox. Я знаю, что выбранным значением будет имя CompanyName из объекта Office, а SeletecValuePath будет CompanyName из объекта Company.

+0

Если вы установили datacontext в .Local, вы должны показать нам код этого класса. из опубликованного вами xaml - .Local - это некоторый тип коллекции, и каждый элемент в этой коллекции должен иметь как минимум публичное свойство CompanyName. Это так? – blindmeis

ответ

3

В View Model:

class OfficeViewModel 
{ 

    private string _CompanyName; 

    public string CompanyName 
    { 
     get 
     { 
      return _CompanyName; 
     } 
     set 
     { 
      _CompanyName = value; 
      NotifyPropertyChanged("CompanyName"); 
     } 
    } 

    private List<Location> _CompanyList; 

    public List<Location> CompanyList 
    { 
     get 
     { 
      return _CompanyList; 
     } 
     set 
     { 
      _CompanyList = value; 
      NotifyPropertyChanged("CompanyList"); 
     } 
    } 

    public List<Company> GetCompanyList() 
    { 
     return (from comp in Entity.Companies select comp).ToList(); 
    } 
} 

В Xaml:

Добавить пространство имен в XAML следующим образом:

xmlns:ViewModels="clr-namespace:WpfMvvmApplication.ViewModels" 

Добавьте следующее в window.resources:

<Window.Resources> 
    <ViewModels:OfficeViewModel x:Key="OfficeController"/>  
</Window.Resources> 

Bind Модель View to combobox:

<Label Grid.Row="4" Grid.Column="0" Margin="10,10">Company:</Label> 
<ComboBox Grid.Row="4" Grid.Column="1" Margin="10,10" 
      ItemsSource="{Binding CompanyList, Source={StaticResource OfficeController}}" 
      DisplayMemberPath="CompanyName" 
      SelectedValuePath="CompanyName" 
      SelectedValue="{Binding Path=CompanyName}"/> 

Надеюсь, это вам поможет.

+0

Отлично! Я изменил GetCompanyList() на пустоту и вызвал ее из конструктора моего OfficeViewModel. Это нормально? – francisg3

+0

Да, вы тоже можете позвонить. – Krish