Инфраструктура xamDataGrid привязана к иерархическим данным - как уведомить сетку об изменениях на втором уровне? - PullRequest
2 голосов
/ 30 марта 2011

Давайте сначала представим некоторые доменные объекты:

Customer:
  Name
  Phone
  List of Orders

Order:
  Date
  Amount

Моя сетка затем устанавливается со следующими наборами полей:

<XamDataGrid>
  <XamDataGrid.FieldLayouts>
    <FieldLayout Key="Customers">
      <Field Name="Orders" IsExpandable="True" />
      <Field Name="Name" />
      <Field Name="Phone" />
    </FieldLayout>
    <FieldLayout ParentFieldLayoutKey="Customers">
      <Field Name="Date" />
      <Field Name="Amount" />
    </FieldLayout>
  </XamDataGrid.FieldLayouts>
</XamDataGrid>

Это прекрасно работает, когда мой список клиентов предварительно заполнен данными. Каждая строка клиента получает знак «+», и при щелчке строка расширяется, показывая список заказов.

Теперь все хорошее заканчивается ...

Мы попытались получить асинхронные заказы, которые дают нам пустую коллекцию, когда пользователь расширяет строку. По завершении асинхронного вызова коллекция обновляется, но сетка не обновляется.

Поскольку коллекция изначально пуста, сетка удаляет +, и у пользователя больше нет возможности свернуть / развернуть. Если коллекция содержит данные, когда пользователь впервые расширяет строку, сетка требует обновления, если мы добавим больше объектов в коллекцию.

Как это должно работать?

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Попробуйте использовать ObservableCollection как набор узлов в вашей древовидной структуре.

0 голосов
/ 15 июля 2015

Пожалуйста, попробуйте это ... Это работает

Прежде всего, создайте два таких класса

public class CustomerDetails1
    {
        public string Id { set; get; }
        public string Name { set; get; }
        public string Place { set; get; }
        public string Mobile { set; get; }
        public List<Level2Customer> Level2CustomerInst { get; set; }
    }

    public class Level2Customer
    {
        public string Address { set; get; }
        public string Street { set; get; }
    }

На странице Xaml

<igWPF:XamDataGrid Width="767" Name ="TestDatagrid"  DataSource="{Binding CustomerList1}"   Height="403">
                                    <igWPF:XamDataGrid.FieldLayoutSettings>
                                        <igWPF:FieldLayoutSettings AutoGenerateFields="False"/>
                                    </igWPF:XamDataGrid.FieldLayoutSettings>
                                    <igWPF:XamDataGrid.ViewSettings>
                                        <igWPF:GridViewSettings UseNestedPanels="True" Orientation="Vertical"/>
                                    </igWPF:XamDataGrid.ViewSettings>
                                    <igWPF:XamDataGrid.FieldLayouts>
                                        <igWPF:FieldLayout Key="layer1">
                                            <igWPF:FieldLayout.Fields>
                                                <igWPF:Field Name="Id" Visibility="Visible"/>
                                                <igWPF:Field Name="Name" Visibility="Visible"/>
                                                <igWPF:Field Name="Place" Visibility="Visible"/>
                                                <igWPF:Field Name="Mobile" Visibility="Visible"/>
                                                <igWPF:Field Name="Level2CustomerInst" Visibility="Visible" IsExpandable="True" Label="Level2CustomerInst" IsSelected="True" IsPrimary="True" />
                                            </igWPF:FieldLayout.Fields>
                                        </igWPF:FieldLayout>
                                        <igWPF:FieldLayout Key="Level2CustomerInst"  ParentFieldName="Level2CustomerInst" ParentFieldLayoutKey="layer1">
                                            <igWPF:FieldLayout.Fields>
                                                <igWPF:Field Name="Address"  Label="Address"/>
                                                <igWPF:Field Name="Street"  Label="Street"/>                                                   
                                            </igWPF:FieldLayout.Fields>
                                        </igWPF:FieldLayout>
                                    </igWPF:XamDataGrid.FieldLayouts>

                                </igWPF:XamDataGrid>

Если вы хотитеразверните дочерний список при загрузке. Вы можете попробовать обработать событие InitializeRecord и установить свойство IsExpanded записи:

  private void TestDatagrid_OnInitializeRecord(object sender, InitializeRecordEventArgs e)
    {
       e.Record.IsExpanded = true;
    }
...