Форум программистов, компьютерный форум, киберфорум
Наши страницы

C#: WPF, UWP и Silverlight

Войти
Регистрация
Восстановить пароль
 
NewEd
2 / 2 / 2
Регистрация: 11.10.2007
Сообщений: 52
#1

MVVM. Как подключить данные к DataGridComboBoxColumn? - C# WPF

19.10.2015, 18:23. Просмотров 525. Ответов 2
Метки нет (Все метки)

На форме View.xaml, запускаемой при старте приложения, расположен DateGrid, одна из колонок которого (QuestionCombo) представляет из себя DataGridComboBoxColumn.

Данные в DateGrid получены байндингом к MiddleTable – экземпляр ObservableCollection<MyTable>
В приложенном файле весь проект.

Вопросы:
А) Как показать в поле QuestionCombo данные из поля VAL_Combo из коллекции MiddleTable. Для примера, те же самые данные выведены в колонке таблицы VAL_Combo.
Б) Как в раскрывающемся списке ComboBox этого же поля, показать варианты выбора. Для списка ComboBox существует отдельный «статический» перечень элементов (вариантов выбора), который записан в myCombo - экземпляр ObservableCollection<ComboList> (единственное поле ElementName). Для примера эти же данные выведены в отдельный ComboBox, расположенный рядом с таблицей

View.xalm
Кликните здесь для просмотра всего текста
XML
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
<Window   
            x:Class="DataGridComboBoxColumnQuestion.MainWindow"        
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    
            xmlns:local="clr-namespace:DataGridComboBoxColumnQuestion.ViewModel"
    
            WindowStartupLocation="CenterScreen"
            WindowState="Normal"
            Title="DataGridComboBoxColumnQuestion" Height="200" Width="350"
    >
 
    <Window.DataContext>
        <local:ViewModel/>
    </Window.DataContext>
 
    <Grid  VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ShowGridLines="False">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
 
        <DataGrid x:Name="dgrMiddle" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2"  AutoGenerateColumns="False"
                                    ItemsSource="{Binding Path=MiddleTable, Mode=TwoWay}"
                                    >
            <DataGrid.Columns>
                <DataGridTextColumn Header="VAL_1" Binding="{Binding Path = VAL_1, Mode=TwoWay}"/>
                <DataGridTextColumn Header="VAL_2" Binding="{Binding Path = VAL_2, Mode=TwoWay}"/>
                <DataGridTextColumn Header="VAL_Combo" Binding="{Binding Path = VAL_Combo, Mode=TwoWay}"/>
                
                <!--MVVM. Как сделать так, чтобы в поле комбобокса были показаны 
                а) данные, загруженные из MiddleTable из поля VAL_Combo (как в соседнем поле VAL_Combo)?
                б) и при раскрытии списка комбобокса появлялся список выбора, состоящий из элементов из myCombo (как в расположенном рядом с таблицей комбобокесе cbxElements) -->
                <DataGridTemplateColumn Header="QuestionCombo" Width="Auto">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding myCombo}" DisplayMemberPath="ElementName" Text="{Binding Path = VAL_Combo}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <!--==========-->
 
            </DataGrid.Columns>
        </DataGrid>
        
        <Label Grid.Row="0" Grid.Column="1">Этот работает</Label>
        <ComboBox x:Name="cbxElements" Grid.Row="1" Grid.Column="1" Width="60" Height="20"
                      ItemsSource="{Binding myCombo, Mode=OneWay}"
                      DisplayMemberPath="ElementName"
                      SelectedValuePath="ElementName" HorizontalAlignment="Left" VerticalAlignment="Top"
            />
    </Grid>
</Window>


Модель - ObjectTables.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
 
namespace DataGridComboBoxColumnQuestion.Models
{
 
    public class MyTable
    {
        public Int64 VAL_1 { get; set; }
        public string VAL_2 { get; set; }
        public string VAL_Combo { get; set; }
    }
 
    public class ComboList
    {
        public string ElementName { get; set; }
    }
}


ViewModel.cs
Кликните здесь для просмотра всего текста
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
using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using System.Collections.ObjectModel; //Для ObservableCollection
 
using DataGridComboBoxColumnQuestion.Models;
 
namespace DataGridComboBoxColumnQuestion.ViewModel
{
    public class ViewModel
    {
        public string[] arrElementsCombo ={"Элемент 1","Элемент 2","Элемент 3","Элемент 4","Элемент 5","Элемент 6"};//для DataGridComboBox
        public ObservableCollection<ComboList> myCombo { get; set; } //для DataGridComboBox
 
        public ObservableCollection<MyTable> MiddleTable {get; set;} //для таблицы
        
        public ViewModel()
        {
 
            //заполнение для DataGridComboBox со списком
            myCombo = new ObservableCollection<ComboList>();
            for (int i = 0; i < arrElementsCombo.Count(); i++) { myCombo.Add(new ComboList { ElementName = arrElementsCombo[i] }); }
 
            //указываю путь к файлу с xml данными FileSample.xml
            string xmlUrl = Directory.GetCurrentDirectory();
            xmlUrl = Directory.GetParent(xmlUrl).ToString();
            xmlUrl = Directory.GetParent(xmlUrl).ToString() + "\\FileSample.xml";
            
            //загружаю данные из файла в документ
            XDocument xdoc = XDocument.Load(xmlUrl);
            
            //считываю только те поля и их значения, которые нужны для таблицы
            var importXML = (from MYTABLE in xdoc.Root.Elements("DATA").Elements("MYTABLE").Elements("TABLEROW")
                                  select new
                                  {
                                      VAL_1 = Convert.ToInt64(MYTABLE.Attribute("VAL_1").Value),
                                      VAL_2 = MYTABLE.Attribute("VAL_2").Value,
                                      VAL_Combo = MYTABLE.Attribute("VAL_Combo").Value,
                                  }).ToList();
 
 
                        //т.к. в качестве источника данных для DataGrid можно использовать только коллекции, создаю ObservableCollection
            MiddleTable = new ObservableCollection<MyTable>();
 
            //переписываю все значения из importXML в ObservableCollection
            foreach (var ev in importXML)
            {
                MiddleTable.Add (new MyTable { VAL_1 = ev.VAL_1, VAL_2 = ev.VAL_2, VAL_Combo = ev.VAL_Combo });
            }
        }
    }
}
0
Вложения
Тип файла: rar DataGridComboBoxColumn - question.rar (86.3 Кб, 9 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2015, 18:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос MVVM. Как подключить данные к DataGridComboBoxColumn? (C# WPF):

Привязать данные к DataGridComboBoxColumn - C# WPF
Недавно начал изучение языка. Помогите разобраться. Есть dataGrid1, который должен заполняться из класса Item. Класс Item имеет...

Динамические данные в DataGridComboBoxColumn - C#
Есть DataGrid, в нём две колонки DataGridComboBoxColumn. В первой колонке страны, во второй города. Есть таблица соответствия городов...

Как правильно передать данные из View во ViewModel чтобы не нарушить шаблон MVVM - C#
Здравствуйте. Вопрос такой есть View в него загружается html страница из интернета. И есть обработчик события который выполняется когда...

MVVM. Загрузить данные из xml в DateGrid? - C# WPF
На форме View.xaml, запускаемой при старте приложения, расположен DateGrid и кнопка «Load xml to DataGrid». Есть файл FileSample.xml в...

MVVM. Загрузить данные из xml в DatePicker? - C# WPF
На форме View.xaml, запускаемой при старте приложения, расположен DatePicker. Есть файл FileSample.xml (см. в архиве) в котором записана...

Как выровнять содержимое DataGridComboBoxColumn по центру? - C# WPF
Подскажите как в WPF выровнять содержимое DataGridComboBoxColumn по центру?

2
ViterAlex
5860 / 3080 / 924
Регистрация: 11.02.2013
Сообщений: 6,734
Завершенные тесты: 3
21.10.2015, 01:41 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Имя local для пространства имён в XAML традицинно используется для ссылки на корневое пространство имён проекта. Для видовой модели используют обычно vm. Это я исправил.
Кликните здесь для просмотра всего текста
XML
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
<Window x:Class="DataGridComboBoxColumnQuestion.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DataGridComboBoxColumnQuestion"
        xmlns:vm="clr-namespace:DataGridComboBoxColumnQuestion.ViewModel"
        WindowStartupLocation="CenterScreen"
        WindowState="Normal"
        Title="DataGridComboBoxColumnQuestion"
        Height="200"
        Width="350">
 
    <Window.DataContext>
        <vm:ViewModel />
    </Window.DataContext>
 
    <Grid  VerticalAlignment="Stretch"
           HorizontalAlignment="Stretch"
           ShowGridLines="False">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
 
        <DataGrid x:Name="dgrMiddle"
                  Grid.Row="0"
                  Grid.Column="0"
                  Grid.RowSpan="2"
                  AutoGenerateColumns="False"
                  ItemsSource="{Binding Path=MiddleTable, Mode=TwoWay}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="VAL_1"
                                    Binding="{Binding Path = VAL_1, Mode=TwoWay}" />
                <DataGridTextColumn Header="VAL_2"
                                    Binding="{Binding Path = VAL_2, Mode=TwoWay}" />
                <DataGridTextColumn Header="VAL_Combo"
                                    Binding="{Binding Path = VAL_Combo, Mode=TwoWay}" />
 
                <!--MVVM. Как сделать так, чтобы в поле комбобокса были показаны 
                а) данные, загруженные из MiddleTable из поля VAL_Combo (как в соседнем поле VAL_Combo)?
                б) и при раскрытии списка комбобокса появлялся список выбора, состоящий из элементов из myCombo (как в расположенном рядом с таблицей комбобокесе cbxElements) -->
                
                
                <DataGridComboBoxColumn ItemsSource="{Binding Source={x:Static vm:ViewModel.myCombo}}"
                                        SelectedValueBinding="{Binding VAL_Combo}"/>
                <!--==========-->
 
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Коллекция для отображения должна быть строковой, т.к. устанавливаемый параметр VAL_Combo тоже строковый. И коллекция должна быть объявлена как статическое свойство:
Кликните здесь для просмотра всего текста
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
using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using System.Collections.ObjectModel; //Для ObservableCollection
 
using DataGridComboBoxColumnQuestion.Models;
 
namespace DataGridComboBoxColumnQuestion.ViewModel {
    public class ViewModel {
        public string[] arrElementsCombo = { "Элемент 1", "Элемент 2", "Элемент 3", "Элемент 4", "Элемент 5", "Элемент 6" };//для DataGridComboBox
        public static ObservableCollection<string> myCombo { get; set; } //для DataGridComboBox
 
        public ObservableCollection<MyTable> MiddleTable { get; set; } //для таблицы
 
        public ViewModel() {
 
            //заполнение для DataGridComboBox со списком
            myCombo = new ObservableCollection<string>();
            foreach (var item in arrElementsCombo) {
                myCombo.Add(item);
            }
           
 
            //указываю путь к файлу с xml данными FileSample.xml
            string xmlUrl = Directory.GetCurrentDirectory();
            xmlUrl = Directory.GetParent(xmlUrl).ToString();
            xmlUrl = Directory.GetParent(xmlUrl).ToString() + "\\FileSample.xml";
 
            //загружаю данные из файла в документ
            XDocument xdoc = XDocument.Load(xmlUrl);
 
            //считываю только те поля и их значения, которые нужны для таблицы
            var importXML = (from MYTABLE in xdoc.Root.Elements("DATA").Elements("MYTABLE").Elements("TABLEROW")
                             select new {
                                 VAL_1 = Convert.ToInt64(MYTABLE.Attribute("VAL_1").Value),
                                 VAL_2 = MYTABLE.Attribute("VAL_2").Value,
                                 VAL_Combo = MYTABLE.Attribute("VAL_Combo").Value,
                             }).ToList();
 
 
            //т.к. в качестве источника данных для DataGrid можно использовать только коллекции, создаю ObservableCollection
            MiddleTable = new ObservableCollection<MyTable>();
 
            //переписываю все значения из importXML в ObservableCollection
            foreach (var ev in importXML) {
                MiddleTable.Add(new MyTable { VAL_1 = ev.VAL_1, VAL_2 = ev.VAL_2, VAL_Combo = ev.VAL_Combo });
            }
        }
    }
}
1
NewEd
2 / 2 / 2
Регистрация: 11.10.2007
Сообщений: 52
23.10.2015, 09:31  [ТС] #3
Спасибо за ответ.
От экспертов получил ещё один комплексный вариант, который положил в топик
MVVM. Загрузить данные из xml в DateGrid?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2015, 09:31
Привет! Вот еще темы с ответами:

Обновлять коллекцию, не перезаписывая данные, а добавляя новые в ежедневнике MVVM - C# WPF
Здравствуйте! Пишу сейчас небольшой ежедневник. Есть класс который добавляет задачи по времени дня. Вот фрагмент кода. public void...

DataGridComboBoxColumn в DataGride: как отловить его события - C# WPF
Привет всем!=) Помогите разобраться плз, создаю DataGrid, в нем 1 столбец ComboBox. Как теперь отловить нажатие на этот КомбоБокс?!!...

DataGridComboBoxColumn - C# WPF
Такая проблема. есть 3 таблицы Typ, Wertart и таблица Typ_Wertart, таблица Typ_Wertart содержит ключи первых двух таблиц. т.е. это...

Заполнение DataGridComboBoxColumn - C# WPF
Добрый день. Одно из полей DataGrid'а DataGridComboBoxColumn: &lt;DataGridComboBoxColumn Header=&quot;Цель звонка&quot; x:Name=&quot;targetComboBox&quot;...


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

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

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