Заполнить combobox данными из запроса (mvvm)

171
28 марта 2018, 01:59

Данный запрос наполняет DataGrid. Можно ли как то из этого же запроса наполнить combobox значениями колонки Manager_History.SIP не изменяя модель и тд.

var sips = @"select
                        Manager_History.SIP,
                        Projects.Project_name as Проект,
                        (RTRIM(user_info.firstname) + ' ' + RTRIM(user_info.name)) as Менеджер,
                        Manager_History.date_start,
                        Manager_History.time_start,
                        Manager_History.date_end,
                        Manager_History.time_end                     
                        from Manager
                        LEFT JOIN Manager_History ON(Manager_History.id = (select top 1 Manager_History.id from Manager_History where Manager_History.idmanager = Manager.id order by Manager_History.id desc))
                        LEFT JOIN Projects ON(Projects.id = Manager.idproject)
                        LEFT JOIN Users ON(Users.id = Manager.iduser)
                        LEFT JOIN user_info ON(user_info.id = Users.user_info_id)
                        WHERE((CAST(convert(varchar, Manager_History.date_end, 104) + ' ' + convert(varchar, Manager_History.time_end, 108) AS datetime) >= getdate()) OR Manager_History.date_end = '1900-01-01')
                        order by Manager_History.sip asc";
            var result1 = db.Database.SqlQuery<BusySip>(sips);
            sipGrid.ItemsSource = result1.ToList();

Модель:

public class BusySip
{
    public Nullable<int> SIP { get; set; }
    public string Проект { get; set; }
    public string Менеджер { get; set; }
    public Nullable<System.DateTime> date_start { get; set; }
    public Nullable<System.TimeSpan> time_start { get; set; }
    public Nullable<System.DateTime> date_end { get; set; }
    public Nullable<System.TimeSpan> time_end { get; set; }
}
Answer 1

Я делаю так:
Создаю коллекцию нужных мне элементов в VM

public List<BusySip> BusySips{ get; set; }

Потом в разметке XAML привязываю ItemSource контрола ComboBox эту коллекцию и выбираю нужные мне поля через тег <Run>.

<ComboBox ItemsSource="{Binding BusySips}">
    <ComboBox.ItemTemplate>
       <DataTemplate>
           <TextBlock>
                <Run Text="{Binding SIP}"/>
            </TextBlock>
       </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Для того чтобы узнать выбранный элемент, вы можете добавить ComboBox'y свойство SelectedItem.

<ComboBox ItemsSource="{Binding BusySips}" SelectedItem="{Binding SelectedBusySip}">
    <ComboBox.ItemTemplate>
       <DataTemplate>
           <TextBlock>
                <Run Text="{Binding SIP}"/>
            </TextBlock>
       </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

И объявить свойство в вашей VM

public BusySip SelectedBusySip{ get; set; }
Answer 2

Кажется, можно сделать так:

combobox.ItemsSource = result1.Select(x => x.SIP);

Но такое ощущение, что это уже не Mvvm, потому что идёт обращение к контролам WPF.

READ ALSO
Парсинг WORD-документов

Парсинг WORD-документов

В общем, есть Word-документы формата *doc

154
Ajax, не добавляется первая запись в html

Ajax, не добавляется первая запись в html

Добрый день, подскажитеЕсть запрос ajax, он работает, данные в БД передаются, ответ приходит, если в БД есть хоть 1 запись, то полученные данные...

210
addEventListener и Promise

addEventListener и Promise

Ситуация следующаяЕсть какой-то класс A, при создании которого в конструкторе на определенный узел DOM должен быть навешен обработчик

251
Убрать _id из запроса данных mongoDB

Убрать _id из запроса данных mongoDB

Есть бд в которой находятся 3 значения:

269