Привязка данных из Entity Framework к ComboBox в WPF

357
07 сентября 2017, 15:54

Здравствуйте! Пишу простое приложение для отображения, добавления и удаления компаний и их пользователей, и никак не могу понять, как привязать данные из Entity к ComboBox. Имеется следующая модель данных:

class Company
    {
        public Company()
        {
            this.Users = new ObservableCollection<User>();
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public string ContractStatus { get; set; } // 0 = не заключён, 1 = заключён, 2 = расторгнут
        public virtual ObservableCollection<User> Users { get; private set; }
    }
    class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Login { get; set; }
        public string Password { get; set; } // identity?
        public int CompanyId { get; set; }
        public virtual Company Company { get; set; }
    }
    class RiKContext : DbContext
    {
        public RiKContext() : base("RiKDb") { }
        public DbSet<User> Users { get; set; }
        public DbSet<Company> Companies { get; set; }
    }

В ComboBox на форме добавления/редактирования должно отображаться имя компании (если редактируем уже существующего пользователя -- в ComboBox отображается имя компании, к которой он в текущий момент привязан), а выбираться, соответственно, её ID.

Код формы XAML:

<Window x:Class="TestTask_mscw.UserAddOrEdit"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestTask_mscw"
        mc:Ignorable="d"
        Title="UserAddOrEdit" Height="300" Width="300" Loaded="Window_Loaded">
    <Window.Resources>
        <CollectionViewSource x:Key="companyViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Company}, CreateList=True}"/>
    </Window.Resources>
    <Grid>
        <Label Content="Имя" HorizontalAlignment="Left" Margin="27,24,0,0" VerticalAlignment="Top"/>
        <Label Content="Логин" HorizontalAlignment="Left" Margin="27,97,0,0" VerticalAlignment="Top"/>
        <Label Content="Пароль" HorizontalAlignment="Left" Margin="27,133,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="UserNameTextBox" HorizontalAlignment="Left" Height="23" Margin="162,24,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="LoginTextBox" HorizontalAlignment="Left" Height="23" Margin="162,101,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <PasswordBox x:Name="PasswordPasswordBox" HorizontalAlignment="Left" Margin="162,141,0,0" VerticalAlignment="Top" Width="120"/>
        <Label Content="Подтвердите пароль" HorizontalAlignment="Left" Margin="27,165,0,0" VerticalAlignment="Top"/>
        <PasswordBox x:Name="ConfirmPasswordPasswordBox" HorizontalAlignment="Left" Margin="162,173,0,0" VerticalAlignment="Top" Width="120"/>
        <Button x:Name="UserOKButton" Content="ОК" HorizontalAlignment="Left" Margin="27,229,0,0" VerticalAlignment="Top" Width="75"/>
        <Button x:Name="UserCancelButton" Content="Отмена" HorizontalAlignment="Left" Margin="207,229,0,0" VerticalAlignment="Top" Width="75"/>
        <Label Content="Компания" HorizontalAlignment="Left" Margin="27,58,0,0" VerticalAlignment="Top"/>
        <ComboBox x:Name="CompanyComboBox" HorizontalAlignment="Left" Margin="162,62,0,0" VerticalAlignment="Top" Width="120" 
                  ItemsSource="{Binding Source={StaticResource companyViewSource}}" DisplayMemberPath="Name" SelectedValue="Id"
                  SelectedValuePath="{Binding Path={???}}"/>
    </Grid>
</Window>

Файл xaml.cs:

   public partial class UserAddOrEdit : Window
    {
        RiKContext db;
        public UserAddOrEdit()
        {
            db = new RiKContext();
            db.Companies.Load();
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            System.Windows.Data.CollectionViewSource companyViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("companyViewSource")));
        }
    }
}

Понимаю, что решение лежит где-то на поверхности, но никак не могу к нему прийти.
Буду благодарен за любую помощь!

READ ALSO
Реализация свойства Count коллекции Collection

Реализация свойства Count коллекции Collection

Делаю свою реализацию коллекции на основе массиваНаследуюсь от шаблонного интерфейса Collection

313
Как вставить данные в поле input в WPF?

Как вставить данные в поле input в WPF?

Как вставить данные в поля страницы и их отсабмитить, но без селениума

271
как принимать предложения обмена в стим (оффлайн трейды) C#

как принимать предложения обмена в стим (оффлайн трейды) C#

Начал работать из стим API, могу получить полный список трейдов (входящих и тех что от меня), но вот как принимать их разобраться не могуНашел...

264