Гость
Map
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding DataGrid класс с вложенными списками / 9 сообщений из 9, страница 1 из 1
13.01.2022, 10:18
    #40126219
Евгений_lea
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding DataGrid класс с вложенными списками
Добрый день всем.
WPF
Подскажите, можно ли реализовать Binding к DataGrid сложный класс, т.е. вложенные списки сделать в строку грида, или всё же конвертировать в плоский класс?
Код: 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.
    public class Plan
    {
        public string GroupName { get; set; }
        public List<ObjItem> Objs { get; set; }

        public class ObjItem
        {
            public string Name { get; set; }
            public List<ParameterItem> Parameters { get; set; }
        }

        public class ParameterItem
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Measure { get; set; }
            public DayValue[] Values { get; set; }
        }

        public class DayValue
        {
            public DateTime Dt;
            public double? Value;
            public string ToolTip;
        }
    }



Вот такой класс, грид группируется по GroupName и ObjItem.Name, раньше класс был плоский, вот так группировал:
Код: c#
1.
2.
3.
4.
ListCollectionView collection = new ListCollectionView(Items);
collection.GroupDescriptions.Add(new PropertyGroupDescription("GroupName"));
collection.GroupDescriptions.Add(new PropertyGroupDescription("Name"));
Plan = collection;


А сейчас с API приходит структурированный класс и не знаю как его привязать.
Код: xml
1.
2.
3.
4.
5.
6.
<DataGrid x:Name="grid" ItemsSource="{Binding Plan, Mode=TwoWay}" ...>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Параметр" Binding="{Binding ParamName}" Width="80" />
        <DataGridTextColumn Header="Ед.изм." Binding="{Binding Measure}" Width="80" />
    </DataGrid.Columns>
</DataGrid>



Ещё в WPF шарю не очень, не судите строго.
...
Рейтинг: 0 / 0
13.01.2022, 11:07
    #40126235
Евгений_lea
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding DataGrid класс с вложенными списками
...
Рейтинг: 0 / 0
13.01.2022, 14:24
    #40126317
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding DataGrid класс с вложенными списками
Слить в один плоский список, и группировка в несколько уровней.
https://docs.microsoft.com/en-us/dotnet/desktop/wpf/controls/how-to-group-sort-and-filter-data-in-the-datagrid-control?view=netframeworkdesktop-4.8
...
Рейтинг: 0 / 0
14.01.2022, 10:22
    #40126501
Евгений_lea
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding DataGrid класс с вложенными списками
Спасибо, понятно, у меня так раньше и было, думал есть альтернативное решение.
API-ка выдает структурный объект, было бы классно ничего не конвертить.
...
Рейтинг: 0 / 0
14.01.2022, 13:22
    #40126571
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding DataGrid класс с вложенными списками
Евгений_lea
Спасибо, понятно, у меня так раньше и было, думал есть альтернативное решение.
API-ка выдает структурный объект, было бы классно ничего не конвертить.

Ну, вполне себе можно использовать вложенные DataTemplate. Решение с плоским списком и многоуровневой группировкой проще, и плюс с этому - сырые данные не являются полноценной вложенной вьюмоделью, в нормальных условиях конвертация всё равно бы понадобилась.
Ну а если уж очень хочется - можно как-то так:
запрос для получения тестовых данных:
Код: sql
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.
;with schemas as (
  select distinct schema_id from sys.objects
), types as (
  select distinct type_desc, schema_id from sys.objects
)
select
  schema_name(s.schema_id) as "@name",
  (
    select
      type_desc as "@name",
      (
        select top 10
          o.object_id,
          o.name,
          o.create_date,
          o.modify_date,
          o.is_ms_shipped
        from sys.objects o
        where o.schema_id=s.schema_id and o.type_desc=t.type_desc
        for xml raw('object'), type
      )
    from types t
    where t.schema_id=s.schema_id
    for xml path('type'), type
  )
from schemas s
for xml path('schema'), root, type


возвращаемые данные
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
<root>
  <schema
    name="dbo">
    <type
      name="SERVICE_QUEUE">
      <objects>
        <object
          object_id="1003150619"
          name="QueryNotificationErrorsQueue"
          create_date="2009-04-13T12:59:08.967"
          modify_date="2009-04-13T12:59:08.967"
          is_ms_shipped="1" />
        <object
          object_id="1035150733"
          name="EventNotificationErrorsQueue"
          create_date="2009-04-13T12:59:08.983"
          modify_date="2009-04-13T12:59:08.983"
          is_ms_shipped="1" />
        <object
          object_id="1067150847"
          name="ServiceBrokerQueue"
          create_date="2009-04-13T12:59:08.983"
          modify_date="2009-04-13T12:59:08.983"
          is_ms_shipped="1" />
      </objects>
    </type>
    <type
      name="SQL_STORED_PROCEDURE">
      <objects>
        <object
          object_id="1803153469"
          name="sp_MSrepl_startup"
          create_date="2014-02-20T20:50:44.060"
          modify_date="2014-02-20T20:51:04.173"
          is_ms_shipped="1" />
        <object
          object_id="1819153526"
          name="sp_MScleanupmergepublisher"
          create_date="2014-02-20T20:50:44.080"
          modify_date="2014-02-20T20:51:04.180"
          is_ms_shipped="1" />
      </objects>
    </type>
    <type
      name="USER_TABLE">
      <objects>
        <object
          object_id="117575457"
          name="spt_fallback_db"
          create_date="2003-04-08T09:18:01.557"
          modify_date="2014-02-20T20:51:04.127"
          is_ms_shipped="1" />
        <object
          object_id="133575514"
          name="spt_fallback_dev"
          create_date="2003-04-08T09:18:02.870"
          modify_date="2014-02-20T20:51:04.137"
          is_ms_shipped="1" />
        <object
          object_id="149575571"
          name="spt_fallback_usg"
          create_date="2003-04-08T09:18:04.180"
          modify_date="2014-02-20T20:51:04.143"
          is_ms_shipped="1" />
        <object
          object_id="1483152329"
          name="spt_monitor"
          create_date="2014-02-20T20:49:38.300"
          modify_date="2014-02-20T20:51:04.157"
          is_ms_shipped="1" />
        <object
          object_id="1787153412"
          name="MSreplication_options"
          create_date="2014-02-20T20:50:43.983"
          modify_date="2016-02-01T13:17:04.293"
          is_ms_shipped="1" />
      </objects>
    </type>
    <type
      name="VIEW">
      <objects>
        <object
          object_id="1467152272"
          name="spt_values"
          create_date="2014-02-20T20:49:38.257"
          modify_date="2014-02-20T20:49:38.300"
          is_ms_shipped="1" />
      </objects>
    </type>
  </schema>
  <schema
    name="sys">
    <type
      name="INTERNAL_TABLE">
      <objects>
        <object
          object_id="1019150676"
          name="queue_messages_1003150619"
          create_date="2009-04-13T12:59:08.967"
          modify_date="2014-02-20T20:48:34.780"
          is_ms_shipped="1" />
        <object
          object_id="1051150790"
          name="queue_messages_1035150733"
          create_date="2009-04-13T12:59:08.983"
          modify_date="2014-02-20T20:48:34.780"
          is_ms_shipped="1" />
        <object
          object_id="1083150904"
          name="queue_messages_1067150847"
          create_date="2009-04-13T12:59:08.983"
          modify_date="2014-02-20T20:48:34.783"
          is_ms_shipped="1" />
        <object
          object_id="1147151132"
          name="syscommittab"
          create_date="2014-02-20T20:48:34.660"
          modify_date="2014-02-20T20:48:34.660"
          is_ms_shipped="1" />
        <object
          object_id="1291151645"
          name="sqlagent_jobs"
          create_date="2014-02-20T20:48:34.993"
          modify_date="2014-02-20T20:48:35.003"
          is_ms_shipped="1" />
        <object
          object_id="1307151702"
          name="sqlagent_jobsteps"
          create_date="2014-02-20T20:48:35"
          modify_date="2014-02-20T20:48:35.013"
          is_ms_shipped="1" />
        <object
          object_id="1323151759"
          name="sqlagent_job_history"
          create_date="2014-02-20T20:48:35.003"
          modify_date="2014-02-20T20:48:35.013"
          is_ms_shipped="1" />
        <object
          object_id="1339151816"
          name="sqlagent_jobsteps_logs"
          create_date="2014-02-20T20:48:35.007"
          modify_date="2014-02-20T20:48:35.010"
          is_ms_shipped="1" />
      </objects>
    </type>
    <type
      name="SYSTEM_TABLE">
      <objects>
        <object
          object_id="3"
          name="sysrscols"
          create_date="2014-02-20T20:48:34.573"
          modify_date="2014-02-20T20:48:34.580"
          is_ms_shipped="1" />
        <object
          object_id="5"
          name="sysrowsets"
          create_date="2009-04-13T12:59:05.513"
          modify_date="2014-02-20T20:48:34.887"
          is_ms_shipped="1" />
        <object
          object_id="6"
          name="sysclones"
          create_date="2014-02-20T20:48:34.807"
          modify_date="2014-02-20T20:48:34.813"
          is_ms_shipped="1" />
        <object
          object_id="7"
          name="sysallocunits"
          create_date="2009-04-13T12:59:05.500"
          modify_date="2014-02-20T20:48:34.603"
          is_ms_shipped="1" />
        <object
          object_id="8"
          name="sysfiles1"
          create_date="2003-04-08T09:13:37.267"
          modify_date="2003-04-08T09:13:37.267"
          is_ms_shipped="1" />
        <object
          object_id="9"
          name="sysseobjvalues"
          create_date="2014-02-20T20:48:34.927"
          modify_date="2014-02-20T20:48:34.933"
          is_ms_shipped="1" />
        <object
          object_id="16"
          name="sysmatrixages"
          create_date="2014-02-20T20:48:34.820"
          modify_date="2014-02-20T20:48:34.827"
          is_ms_shipped="1" />
        <object
          object_id="17"
          name="syspriorities"
          create_date="2014-02-20T20:48:34.673"
          modify_date="2014-02-20T20:48:34.687"
          is_ms_shipped="1" />
        <object
          object_id="18"
          name="sysdbfrag"
          create_date="2014-02-20T20:48:34.533"
          modify_date="2014-02-20T20:48:34.543"
          is_ms_shipped="1" />
        <object
          object_id="19"
          name="sysfgfrag"
          create_date="2014-02-20T20:48:34.543"
          modify_date="2014-02-20T20:48:34.550"
          is_ms_shipped="1" />
      </objects>
    </type>
  </schema>
</root>


Классы для десериализации:
Код: 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.
[XmlRoot(ElementName="root", Namespace = "", IsNullable = false)]
public class DbObjects
{
  [XmlElement("schema")]
  public List<Schema> Schemas { get; set; }
}

public class Schema
{
  [XmlAttribute("name")]
  public string Name { get; set; }

  [XmlElement("type")]
  public List<DbType> Types { get; set; }
}

public class DbType
{
  [XmlAttribute("name")]
  public string Name { get; set; }

  [XmlElement("object")]
  public List<DbObject> Objects { get; set; }
}

public class DbObject
{
  [XmlAttribute("object_id")]
  public int Id { get; set; }

  [XmlAttribute("name")]
  public string Name { get; set; }

  [XmlAttribute("create_date")]
  public DateTime Created { get; set; }

  [XmlAttribute("modify_date")]
  public DateTime Modified { get; set; }

  [XmlAttribute("is_ms_shipped")]
  public bool IsMsShipped { get; set; }
}


Вьюмодель:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class TestModel : INotifyPropertyChanged
{
  public IReadOnlyCollection<Schema> Schemas { get; private set; }

  public async Task Init()
  {
    using (var cnn = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True"))
    {
      await cnn.OpenAsync();
      using (var cmd = new SqlCommand(Properties.Resources.SysObjects, cnn))
      using (var rd = await cmd.ExecuteReaderAsync())
      {
        if (!await rd.ReadAsync())
          throw new InvalidOperationException();
        using (var xr = rd.GetSqlXml(0).CreateReader())
          Schemas = ((DbObjects)new XmlSerializer(typeof(DbObjects)).Deserialize(xr)).Schemas;
      }
    }
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Schemas)));
  }
  public event PropertyChangedEventHandler PropertyChanged;
}


Вью:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public partial class MainWindow
{
  public MainWindow()
  {
    InitializeComponent();
    Loaded += async (a,e)=> await ((TestModel)DataContext).Init();
  }
}


Код: 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.
<Window
  x:Class="wpftest45.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:wpftest"
  Width="800"
  Height="550"
  Title="Window1">

  <Window.Resources>
    <local:TestModel x:Key="TestModel" />
    <DataTemplate x:Key="DbTypeTemplate" DataType="{x:Type local:DbType}">
      <StackPanel>
        <TextBlock Text="{Binding Name}" />
        <DataGrid
          ItemsSource="{Binding Objects}" />
      </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="SchemaTemplate" DataType="{x:Type local:Schema}">
      <StackPanel>
        <TextBlock Text="{Binding Name}" />
        <ListView
          ItemTemplate="{StaticResource DbTypeTemplate}"
          ItemsSource="{Binding Types}" />
      </StackPanel>
    </DataTemplate>
  </Window.Resources>
  
  <Window.DataContext>
    <StaticResource ResourceKey="TestModel" />
  </Window.DataContext>


  <ListView
    ItemsSource="{Binding Schemas}"
    ItemTemplate="{StaticResource SchemaTemplate}" />
</Window>
...
Рейтинг: 0 / 0
17.01.2022, 09:40
    #40127138
Евгений_lea
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding DataGrid класс с вложенными списками
Спасибо, интересно, надо попробовать.
...
Рейтинг: 0 / 0
20.01.2022, 10:35
    #40128021
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding DataGrid класс с вложенными списками
Евгений_lea , можно сделать парсинг коллекции в столбцы на Шарпе в событии AutoGenerateColumns.
Но возникает проблема с определением нужного количество колонок.
Ведь вы используете простые списки, которые в каждой строке могут иметь разное количество элементов.
Если у вас есть какие-то условия по которым можно определить количество колонок, то решение сделать не трудно.
...
Рейтинг: 0 / 0
20.01.2022, 11:21
    #40128027
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding DataGrid класс с вложенными списками
просто сделай нормальный ViewModel и приводи данные к тому виду, который хочешь отобразить, это же основа основ MVVM
...
Рейтинг: 0 / 0
20.01.2022, 13:27
    #40128067
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding DataGrid класс с вложенными списками
Roman Mejtes , я думаю, что это зависит от задания и реализованной архитектуры Решения.
В общем случае, задачи представления должны решаться в Представлении, а не в VM.
Основная функция VM - отражение Модели в свои свойства.
В том числе, как вы верно заметили, коллекция Модели может отражаться в более удобную для Представления коллекцию.
Но если этот более "удобный вид" больше ни для чего не нужен, то можно и в Представлении создать правильную компоновку по коллекции с исходным типом элементов.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding DataGrid класс с вложенными списками / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]