powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding DataGrid класс с вложенными списками
9 сообщений из 9, страница 1 из 1
Binding DataGrid класс с вложенными списками
    #40126219
Евгений_lea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.
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
Binding DataGrid класс с вложенными списками
    #40126235
Евгений_lea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Binding DataGrid класс с вложенными списками
    #40126317
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слить в один плоский список, и группировка в несколько уровней.
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
Binding DataGrid класс с вложенными списками
    #40126501
Евгений_lea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, понятно, у меня так раньше и было, думал есть альтернативное решение.
API-ка выдает структурный объект, было бы классно ничего не конвертить.
...
Рейтинг: 0 / 0
Binding DataGrid класс с вложенными списками
    #40126571
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений_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
Binding DataGrid класс с вложенными списками
    #40127138
Евгений_lea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, интересно, надо попробовать.
...
Рейтинг: 0 / 0
Binding DataGrid класс с вложенными списками
    #40128021
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений_lea , можно сделать парсинг коллекции в столбцы на Шарпе в событии AutoGenerateColumns.
Но возникает проблема с определением нужного количество колонок.
Ведь вы используете простые списки, которые в каждой строке могут иметь разное количество элементов.
Если у вас есть какие-то условия по которым можно определить количество колонок, то решение сделать не трудно.
...
Рейтинг: 0 / 0
Binding DataGrid класс с вложенными списками
    #40128027
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто сделай нормальный ViewModel и приводи данные к тому виду, который хочешь отобразить, это же основа основ MVVM
...
Рейтинг: 0 / 0
Binding DataGrid класс с вложенными списками
    #40128067
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes , я думаю, что это зависит от задания и реализованной архитектуры Решения.
В общем случае, задачи представления должны решаться в Представлении, а не в VM.
Основная функция VM - отражение Модели в свои свойства.
В том числе, как вы верно заметили, коллекция Модели может отражаться в более удобную для Представления коллекцию.
Но если этот более "удобный вид" больше ни для чего не нужен, то можно и в Представлении создать правильную компоновку по коллекции с исходным типом элементов.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding DataGrid класс с вложенными списками
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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