Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
skew
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 157
1

Взаимосвязь Entity Framework и XAML

27.02.2018, 01:03. Просмотров 557. Ответов 17
Метки нет (Все метки)

Доброго вечера. Столкнулся с очередной трудностью, которую не могу решить перечитывая разные источники информации.
Имею базу данных MsSql, в ней таблица Stage, содержащая поля (StageId, Name). Имеется класс модели данной таблицы StageModel.
Всем этим пытаюсь управлять через Entityframework. Далее имею ComboBox, который должен содержать в себе поля Name из указанной выше таблицы. (при возможности как-нибудь и StageId, т.к. он будет связан с полем типа Enum в программе), необходимо как-то обратиться к AuthWindowViewModel, в которой имеется соединение с БД (DataBaseContext db //производный класс от DbContext, содержащий поле DbSet<StageModel> Stages)
Есть ли возможность сделать это все через (View)XAML чтобы не лезть во ViewModel ? Спасибо
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2018, 01:03
Ответы с готовыми решениями:

Entity Framework и WPF
Доброго вечера, форумчане! Вопрос где можно почитать (на русском языке) про работу с Entity...

Entity Framework и ObservableCollection
хочу понять как правильно использовать энтити модель для управления данными (сохранения,...

MVVM и Entity Framework
Всем привет.Столкнулся с проблемой в том что не сохраняет изменения в базе данных(в таблице...

Использование MVVM + Entity Framework
Добрый вечер! Хотел бы понять как работать по паттерну MVVM в связке с entity, есть некая проблема...

Entity Framework и сортировка в DataGrid
Добрий день. Для соединения с DataGrid использываю Entity Framework, и передаю в ItemSourse свою...

17
skilllab
224 / 200 / 50
Регистрация: 03.02.2011
Сообщений: 1,848
Записей в блоге: 1
Завершенные тесты: 1
27.02.2018, 08:00 2
А чего сделать то хотите этим "обращением"?
0
Usaga
Эксперт .NET
6125 / 4340 / 758
Регистрация: 21.01.2016
Сообщений: 16,894
Завершенные тесты: 2
27.02.2018, 08:51 3
skew, сделать можно всё, лишь бы вопрос был нормально сформулирован.

Вы можете вытащить коллекцию данных из базы и прибайндить к вашему ComboBox-у.
0
skew
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 157
27.02.2018, 09:46  [ТС] 4
Извиняюсь если не корректно сформулировал.
Основная цель вытащить из БД данные и поместить в ComboBox, при выборе значения в ComboBox`е помещать результат в переменную типа Enum, соответствующая значениям StageId из таблицы базы данных.
0
27.02.2018, 09:46
skilllab
224 / 200 / 50
Регистрация: 03.02.2011
Сообщений: 1,848
Записей в блоге: 1
Завершенные тесты: 1
27.02.2018, 10:08 5
skew, так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class ViewModel : INotifyPropertyChanging
{
 
    public ObservableCollection<Stage> Table { get; set; }
 
    private Stage _selectedStage;
    public Stage SelectedStage { get { return _selectedStage; } set { _selectedStage = value; OnSelectedStageChanged(); }
    public EMyEnum MyEnum { get; private set; }
 
    private void OnSelectedStageChanged()
    {
        switch (SelectedStage.StageId)
        {
        case 1:
            MyEnum = EMyEnum.First;
            break;
        case 2:
            MyEnum = EMyEnum.Second;
            break;
        default:
            MyEnum = EMyEnum.NotDefined;
            break;
        }
    }
}
 
public enum EMyEnum
{
    First,
    Second,
    NotDefined
}
 
public class Stage
    {
        public int StageId { get; set; }
        public string Name { get; set; }
    }
XML
1
2
3
4
<Grid>
....
  <ComboBox SelectedItem="{Binding SelectedStage, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
1
Usaga
Эксперт .NET
6125 / 4340 / 758
Регистрация: 21.01.2016
Сообщений: 16,894
Завершенные тесты: 2
27.02.2018, 10:09 6
skew, вам не нужны никакие промежуточные Enum-ы. Вы можете байндить к контролу весь класс целиком и потом этот класс получать (или байндить свойство SelectedItem).

С вас только байндинги настроить один раз (при загрузке формы) и всё.
0
skew
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 157
27.02.2018, 10:52  [ТС] 7
skilllab, тут не совсем так, поскольку работаю с EntityFramework, то из нее хочу вытаскивать без промежуточных значений. Вот какие данные сейчас имею (лишнее вырезал). Если немного предыстории, то ViewModel имеет в себе класс пользователя, который с View вводит свои логин/пароль и выбирает роль кем он является (Пользователь/администратор...) - Как раз Enum. Все роли заданы в базе данных MsSql, их нужно загрузить в ComboBox из этой базы, и при выборе пользователем нужной ему роли добавить к нему в класс эту роль, в моем случае в переменную UserAuth типа UserCredentialsModel.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 public class DataBaseContext : DbContext
    {
        public DataBaseContext() : base("SellerDB")
        {
        }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<UserCredentialsModel>().HasKey(k=> k.UserId).ToTable("Users");
            modelBuilder.Entity<StageModel>().HasKey(k=> k.StageId).ToTable("Stage");
        }
        public DbSet<UserCredentialsModel> Users { get; set; }
        public DbSet<StageModel> Stages { get; set; }
    }
 
    public class StageModel
    {
      public int StageId { get; private set; }
      public string Name { get; set; }
    }
 
  public class AuthWindowViewModel
  {   
    public UserCredentialsModel UserAuth { get; set; } = new UserCredentialsModel(); 
    public DataBaseContext db { get; set; } 
             
    public AuthWindowViewModel()
    {     
      db = new DataBaseContext();      
    }
  }
 
public class UserCredentialsModel: INotifyPropertyChanged
  {    
    Roles _role;     
    
    public int UserId { get; private set; }
   
    public Roles Role
    {
      get => _role;
      set
      {  
        _role = value;
        OnPropertyChanged(nameof(Role));
      }
    }
 
    public event PropertyChangedEventHandler PropertyChanged;
 
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
  }
Добавлено через 1 минуту
Usaga, а как так получается, если список берется из одной таблицы, а результат нужно занести в другую переменную. Причем DbSet<T> просто так не дает присоединить через Binding, ведь в полученном списке нужно еще выдернуть значение Name и сопоставить с Id
0
_katon_
390 / 245 / 21
Регистрация: 03.10.2011
Сообщений: 1,014
27.02.2018, 11:27 8
Цитата Сообщение от skew Посмотреть сообщение
Usaga, а как так получается, если список берется из одной таблицы, а результат нужно занести в другую переменную. Причем DbSet<T> просто так не дает присоединить через Binding, ведь в полученном списке нужно еще выдернуть значение Name и сопоставить с Id
Если байндить в xaml, то будет выглядеть приблизительно так:
XML
1
2
3
4
                <ComboBox Margin="0,0,0,10" Name="NameControl" SelectedValuePath="Id" 
                          DisplayMemberPath="Name" ItemsSource="{Binding CollectionName}"
                          SelectedValue="{Binding SelectedItemProp}">
                </ComboBox>
DbSet<T> легко конвертируется в List<T>. Выбор в комбобоксе всегда находится в SelectedItemProp viewmodal.
1
Usaga
Эксперт .NET
6125 / 4340 / 758
Регистрация: 21.01.2016
Сообщений: 16,894
Завершенные тесты: 2
27.02.2018, 11:46 9
Цитата Сообщение от skew Посмотреть сообщение
а как так получается, если список берется из одной таблицы, а результат нужно занести в другую переменную. Причем DbSet<T> просто так не дает присоединить через Binding, ведь в полученном списке нужно еще выдернуть значение Name и сопоставить с Id
Вам нужно сделать выборку из базы и полученную коллекцию уже байндить.
1
skew
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 157
27.02.2018, 12:22  [ТС] 10
Usaga, Это я понимаю, но это дополнительный код, почти копия, поэтому хотел узнать можно ли это сделать напрямую через EF. Т.к. просто если в List занести, то все работает, оставался только вопрос так же без дополнительной пересенной заносить в уже созданную пересенную AuthUser выбор из ComboBox в переменную Role типа Enum

Добавлено через 1 минуту
_katon_, он автоматически конвертировать должен или так же нужно сначала в отдельную пересенную типа Liat вынести и из нее брать?
0
Usaga
Эксперт .NET
6125 / 4340 / 758
Регистрация: 21.01.2016
Сообщений: 16,894
Завершенные тесты: 2
27.02.2018, 12:26 11
skew, какой дополнительный код? Ваш XAML не должен знать ни про какие EF-ы и их DbSet-ы. У вас должен быть класс модели представления напичканный данными (в том числе и из базы) к которым и нужно байндиться.

Никакие Enum-ы вам не нужны. Контрол можно заставить сообщать о выбранном классе из коллекции прибайндиной.
0
skew
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 157
27.02.2018, 12:33  [ТС] 12
Usaga, xaml и не знает про EF, он содержится во ViewModel, и вот можно ли обратившись к этому EF загрузить его dbSet. Если ориентироваться по коду, то взять данные из db.Stages и поместить в ComboBox, а затем при выборе из ComboBox поместить в AuthUser.Role
0
Usaga
Эксперт .NET
6125 / 4340 / 758
Регистрация: 21.01.2016
Сообщений: 16,894
Завершенные тесты: 2
27.02.2018, 12:39 13
skew, вам нужна промежуточная коллекция с выборкой из базы. Так же вам нужно промежуточное свойство, куда будет записываться выбранное значение.
0
_katon_
390 / 245 / 21
Регистрация: 03.10.2011
Сообщений: 1,014
27.02.2018, 12:40 14
Цитата Сообщение от skew Посмотреть сообщение
_katon_, он автоматически конвертировать должен или так же нужно сначала в отдельную пересенную типа Liat вынести и из нее брать?
C#
1
var MyList = context.MyEntity.Select(e => e).ToList();
0
skew
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 157
27.02.2018, 12:46  [ТС] 15
Usaga, Вот, к этому и шёл, возможно ли без промежуточных это сделать или нет.
_katon_, а в xaml возможно организовать это в ComboBox ItemSourse ?
0
Usaga
Эксперт .NET
6125 / 4340 / 758
Регистрация: 21.01.2016
Сообщений: 16,894
Завершенные тесты: 2
27.02.2018, 12:50 16
Цитата Сообщение от skew Посмотреть сообщение
Вот, к этому и шёл, возможно ли без промежуточных это сделать или нет.
Нет. Но даже если бы и можно было, то это было бы сильнейшее "фу". Вам так впадлу запросить из базы коллекцию?

Добавлено через 2 минуты
Ваше представление не должно знать ни о чём кроме модели представления и каких-то мелких хелперов\конвертеров.
0
_katon_
390 / 245 / 21
Регистрация: 03.10.2011
Сообщений: 1,014
27.02.2018, 13:27 17
По идее, даже средненько "вкуренный" MVVM не должен вызывать у вас столько вопросов. Все как и сказал Usaga. Привязки (Binding) единственное, что должно связывать View и ViewModel.
0
skew
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 157
27.02.2018, 13:48  [ТС] 18
Usaga, я просто разбираюсь в тонкостях семантики паттерна mvvm, возможностях и границах этих возможностей. Спасибо большое за помощь
0
27.02.2018, 13:48
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2018, 13:48

Entity Framework 6 и отображение картинок BitmapImage
Здравствуйте ! Только начал изучать EF 6 и столкнулся с небольшой проблемой или не понимаением,...

Silverlight +Ado.net Entity Framework
Народ! хелп плиз ...кучу всего пересмотрел-научился работать с БД используя все, кроме...

Свой метод с фильтром в Entity Framework
Добрый день. Смог создать модель DomainService.cs. В ней есть метод GetPeopes(). Возвращает всех...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.