#wpf #datagrid #wpf-controls
#wpf #datagrid #wpf-элементы управления
Вопрос:
В настоящее время у меня есть связанная сетка данных, которая автоматически генерирует столбцы
<DataGrid x:Name="dataGrid"
ItemsSource="{Binding TestRows}"
HeadersVisibility="All"
GridLinesVisibility="Vertical"
BorderBrush="Gray"
BorderThickness="5"
IsReadOnly="False"
CanUserResizeColumns="False"
CanUserSortColumns = "True"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible"
SelectionMode="Single"
AutoGenerateColumns="True"
AutoGeneratingColumn="dataGrid_AutoGeneratingColumn">
...
...
...
</DataGrid>
Автоматическая генерация отлично работает для строк и целых чисел, но у меня также есть объект типа Dictionary<String, Strategy>
для элементов в моей коллекции данных. Словарь имеет один и тот же ключ для каждого элемента в TestRows
, но содержимое отличается.
Я хочу, чтобы сетка данных динамически добавляла пользовательские DataGridTemplateColumn
для каждого ключа в словаре, используя определенное свойство из значения в качестве значения ячейки. Я подозреваю, что я мог бы добавить что-то для этого в dataGrid_AutoGeneratingColumn
, но я не могу найти способ сделать это.
Как я мог бы добиться того, что я описал выше?
Комментарии:
1. Для каждого ключа в каком словаре? Для всех строк есть только один столбец, но у вас есть свойство dictionary для каждой строки, не так ли? Итак, на какой словарь вы ссылаетесь?
2. TestRows — это наблюдаемая коллекция объектов, с одной строкой на объект в коллекции. Сетка данных автоматически генерирует столбец для каждой строки и int в объекте, что мне и нужно. Однако у меня также есть словарь в объекте. Словарь имеет одинаковые ключи для каждого объекта в TestRows, но я не знаю, какими будут эти ключи до времени выполнения. Я хочу динамически генерировать столбцы на основе этого словаря.
Ответ №1:
TestRows — это наблюдаемая коллекция объектов, с одной строкой на объект в коллекции. Сетка данных автоматически генерирует столбец для каждой строки и int в объекте, что мне и нужно. Однако у меня также есть словарь в объекте. Словарь имеет одинаковые ключи для каждого объекта в TestRows, но я не знаю, какими будут эти ключи до времени выполнения.
AutoGeneratingColumn
Возникает после того, как ItemsSource
был установлен, чтобы вы могли обрабатывать AutoGeneratingColumn
что-то вроде этого:
private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName == nameof(YourClass.YourDictionaryPropertyName))
{
e.Cancel = true;
DataGrid dataGrid = (DataGrid)sender;
IList sourceCollection = dataGrid.ItemsSource as IList;
MyClass firstItem = sourceCollection?[0] as MyClass;
foreach (var key in firstItem.YourDictionaryPropertyName.Keys)
{
dataGrid.Columns.Add(new DataGridTextColumn { Header = "...", Binding = new Binding($"{nameof(YourClass.YourDictionaryPropertyName)}"[{key}]") });
}
}
}
…где YourClass
находится элемент в «TestRows»:
public class YourClass
{
public Dictionary<string, string> YourDictionaryPropertyName { get; }
...
}