В вашем обновленном коде все еще есть ошибка привязки, вам нужно добавить это в конец вашего конструктора:
this.DataContext = this;
Основная проблема с кодом, который вы разместили, заключается в том, что вы пытаетесь объединить массивы Synonym и Acronym в один список, что на самом деле нужно сделать перед передачей данных в слой представления. Я буду использовать конвертер, чтобы выполнить эту задачу позже, но имейте в виду, что это то, что вы, вероятно, должны исправить позже.
В любом случае то, что вы пытаетесь достичь, относительно просто. Используйте DataGridTemplateColumn, чтобы объявить пользовательский тип столбца и установить для его содержимого значение ItemsControl
(его панель по умолчанию - вертикальная панель стека). Каждый элемент панели стека - MeaningGroup
, поэтому просто используйте другой ItemsControl для рендеринга ваших тегов и установите вместо него ItemsPanelTemplate
как горизонтальный макет (я использовал WrapPanel). Соберите все это вместе, и вы получите это:
<Window.Resources>
<behaviors:ListUnionConverter x:Key="ListUnionConverter" />
<DataTemplate x:Key="TagTemplate">
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="5" Margin="5" Padding="5">
<TextBlock Text="{Binding}" />
</Border>
</DataTemplate>
<DataTemplate x:Key="TagListTemplate">
<ItemsControl ItemTemplate="{StaticResource TagTemplate}">
<ItemsControl.ItemsSource>
<MultiBinding Converter="{StaticResource ListUnionConverter}">
<Binding Path="Synonyms" />
<Binding Path="Acronyms" />
</MultiBinding>
</ItemsControl.ItemsSource>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
<DataTemplate x:Key="CellTemplate">
<ItemsControl ItemsSource="{Binding MeaningGroups}" ItemTemplate="{StaticResource TagListTemplate}" />
</DataTemplate>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{Binding Words}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTemplateColumn Header="Synonym and acronyms" IsReadOnly="True" CellTemplate="{StaticResource CellTemplate}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
Вам также понадобится код конвертера, который я использую для объединения синонимов и сокращений в единый список. Опять же, вы должны либо заменить это чем-то более надежным, или, желательно, исправить свои структуры данных, чтобы лучше соответствовать требованиям представления:
Результат:
public class ListUnionConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return (values[0] as IEnumerable<string>).Concat(values[1] as IEnumerable<string>).ToArray();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
ОБНОВЛЕНИЕ: Я только что заметил, что цвета должны быть разными. Вы также можете использовать конвертер, чтобы сделать это, если вам абсолютно необходимо, но это действительно грязное решение. Правильный способ реализовать это - использовать модель с промежуточным представлением и объединить как синонимы, так и сокращения в один список.