Как я могу добавить пользовательские типы столбцов в сетку данных wpf?

#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; }
    ...
}