Сгруппировать записи таблицы данных по скрытому свойству - PullRequest
0 голосов
/ 14 марта 2019

У меня есть следующая структура данных:

public class TimeData
{
    public Employee Employee { get; set; }
    public IList<WorkTime> WorkTimes { get; set; }
}

ViewModel:

public ObservableCollection<TimeData> TimeDatas { get; set; }

В моей таблице данных я хочу отобразить все рабочие часы. Группировка по сотруднику. Как это:

Дата | Часов | TimeCode

Джон Доу

12/03/19 | 8 | 433

13/03/19 | 8 | 433

14/03/19 | 5 | 546

Майк Мустер

12/03/19 | 4 | 653

13/03/19 | 3 | 433

14/03/19 | 9 | 546

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
public class WorkTime
{
    public DateTime Date { get; set; }
    public double Hours { get; set; }
    public string TimeCode { get; set; }
}

Я уже попробовал следующий код:

ListCollectionView collectionView = new ListCollectionView(this.viewModel.TimeDatas);
collectionView.GroupDescriptions.Add(new PropertyGroupDescription("Employee"));
this.grdTimeData.ItemsSource = collectionView;

Это группирует по сотруднику, но не показывает список WorkTimes: Incorrect Datagrid В строках сетки мне нужны только WorkTimes, а Employee только для группировки.

1 Ответ

1 голос
/ 14 марта 2019

Вам необходимо преобразовать ваши данные в формат, который может обрабатывать DataGrid.Создайте класс модели представления, содержащий все свойства:

public class EmployeeAndWorkTime
{
    public string Name { get; set; }
    public DateTime Date { get; set; }
    public double Hours { get; set; }
    public string TimeCode { get; set; }
}

... и привязайте его к IEnumerable<EmployeeAndWorkTime>, который вы создаете из существующей коллекции TimeDatas:

TransformedTimeDatas = TimeDatas.Select(timeData =>
{
    EmployeeAndWorkTime[] viewModels = new EmployeeAndWorkTime[timeData.WorkTimes.Count];
    for (int i = 0; i < timeData.WorkTimes.Count; ++i)
        viewModels[i] = new EmployeeAndWorkTime()
        {
            Name = string.Format("{0} {1}", timeData.Employee.FirstName, timeData.Employee.LastName),
            Date = timeData.WorkTimes[i].Date,
            Hours = timeData.WorkTimes[i].Hours,
            TimeCode = timeData.WorkTimes[i].TimeCode
        };
    return viewModels;
}).ToArray();

ListCollectionView collectionView = new ListCollectionView(TransformedTimeDatas);
collectionView.GroupDescriptions.Add(new PropertyGroupDescription("Name"));
this.grdTimeData.ItemsSource = collectionView;
...