Я пытаюсь настроить сетку данных WPF.Стандартная сетка данных настроена так, чтобы принимать список объектов, отображаемых в разных строках, со столбцом для каждого свойства.Мне действительно нужно сделать обратное;строка для каждого свойства и столбец для каждого объекта в списке.Поэтому я начал с решения, предложенного blindmeis здесь для обработки динамического числа столбцов, и пока оно работает хорошо.
У меня есть класс DataGridVM, которому я могу передать списокобъектов.Каждый из объектов имеет свою собственную модель представления, которая является производной от класса ParentalBaseVM.Каждое свойство этого объекта имеет свою собственную модель представления, которая является производной от класса ElementVM.
Каждый ParentalBaseVM может возвращать список ElementVM для каждого из свойств своего объекта посредством переопределения виртуального метода PropertyLists, например, в примере класса, полученного из класса.из ParentalBaseVM у меня есть:
public override Dictionary<string, List<ElementVM>> PropertyLists
{
get
{
Dictionary<string, List<ElementVM>> iPropertyLists = new Dictionary<string, List<ElementVM>>();
List<ElementVM> BasicProperties = new List<ElementVM>();
BasicProperties.Add(iNBViewModel);
BasicProperties.Add(iIDViewModel);
iPropertyLists.Add("Basic", BasicProperties);
List<ElementVM> AdvancedProperties = new List<ElementVM>();
AdvancedProperties.Add(iNBViewModel);
AdvancedProperties.Add(iIDViewModel);
AdvancedProperties.Add(iXSAreaViewModel);
iPropertyLists.Add("Advanced", AdvancedProperties);
return iPropertyLists;
}
set
{
}
}
Как видите, я могу вернуть другой набор свойств, передав в качестве строки либо «Basic», либо «Advanced».
Код DataGridVMниже.Я перехожу к этому списку объектов (columnList) и строке, которая представляет («Basic» или «Advanced» в приведенном выше примере)
class DataGridVM
{
private List<List<ElementVM>> iDataList;
public DataGridVM(List<ParentalBaseVM> columnList, string rowListKey)
{
iDataList = new List<List<ElementVM>>();
for (int i = 0; i < columnList[0].PropertyLists[rowListKey].Count; i++)
{
List<ElementVM> newRowList = new List<ElementVM>();
for (int j = 0; j < columnList.Count; j++)
{
newRowList.Add(columnList[j].PropertyLists[rowListKey][i]);
}
iDataList.Add(newRowList);
}
}
public List<List<ElementVM>> DataList
{
get
{
return iDataList;
}
set
{
}
}
}
Наконец, сетка данных заполняется с помощью:
testControlDataGrid.testDataGrid.ItemsSource = testDataGridVM.DataList;
А затем столбцы генерируются динамически (код в CreateDataTemplate устанавливает привязки)
for (int i = 0; i < testDataGridVM.DataList[0].Count; i++)
{
testControlDataGrid.testDataGrid.Columns.Add(new DataGridTemplateColumn()
{
Header = "Col" + i,
CellTemplate = CreateDataTemplate(TheTextBlock.GetType(),i)
});
}
Все это прекрасно работает, но выглядит очень грязно.Передача строковых значений типа «Basic» и доступ к словарям кажется неправильным.Возможно, есть элегантное решение, в котором у меня есть классы, производные от DataGridVM, такие как DataGridVMBasicProperties, который обращается к «базовым» свойствам объекта, но я не уверен, что это приведет к повторению большого и большого количества кода.
Кроме того, я не уверен, что загромождать класс ParentalBaseVM с помощью метода, который возвращает список свойств, также замечательно.Я думал о том, чтобы переместить это в новый базовый класс PropertiesListGenerator, который может просто передать ему ParentalBaseVM и вернуть список ElementVM.Производным может быть BasicPropertiesListGenerator, а дальнейшим производным может быть AdvancedPropertiesListGenerator.Однако, если не все ParentalBaseVM содержат «расширенный» список и только «базовый» список, это может вызвать проблемы.Моя главная цель здесь - избежать повторения большого количества кода.
Я никогда не использовал делегатов или интерфейсы настолько, чтобы по-настоящему их понять, поэтому мои навыки кодирования на самом деле не работают на всех цилиндрах.Может быть, они могут помочь обеспечить элегантное решение?
Любая помощь приветствуется.Я новичок в этом, и программирование не моя работа на полную ставку (очевидно).Если вы видите возможности для улучшения компоновки, читабельности, следования условностям, пожалуйста, не стесняйтесь предлагать, я, конечно, не буду обижаться.