DataGridCell селектор шаблонов контента Silverlight
У меня есть DataGrid с динамическими данными (коллекция пользовательских DataRows), которые я получаю с сервера. DataRow имеет индексатор и свойство Data, которое возвращает всю строку данных для привязки (вы увидите ниже)
Я создаю каждый столбец DataGrid таким образом:
DataGridTextColumn column = new DataGridTextColumn();
Binding binding = new Binding("Data[" + i.ToString() + "]");
binding.Mode = BindingMode.TwoWay;
binding.Converter = _dataContextSelector;
binding.ConverterParameter = dataColumn;
column.Binding = binding;
Что мне нужно сделать: мне нужно по-разному отображать содержимое DataGridCells в соответствии с данными, которые возвращает конвертер.
Я написал селектор шаблона (который наследует ContentControl) и поместил его в свойство ContentTemplate объекта DataGridCell таким образом:
<Style TargetType="sdk:DataGridCell">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<view:DataGridCellTemplateSelector Content="{Binding}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
В этом случае у меня есть весь DataRow как содержимое моего селектора (не могу понять почему, потому что столбец был связан с одним элементом строки), и мой конвертер не вызывается. Весь datarow является DataContext по умолчанию, так что, я думаю, моя привязка кода в этом случае просто игнорируется.
Поэтому я попытался поместить свой селектор шаблона в ControlTemplate объекта DataGridCell:
<Style TargetType="sdk:DataGridCell">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="sdk:DataGridCell">
<view:DataGridCellTemplateSelector Content="{TemplateBinding Content}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Но в этом случае у меня есть TextBlock с пустым текстом в качестве содержимого моего селектора (SHOCKED). Конвертер вызывается после изменения содержимого. Как создать селектор шаблонов, который будет выбирать шаблон в соответствии с данными моей привязки (после вызова конвертера)?
1 ответ
- Попробуйте использовать неявные шаблоны данных вместо пользовательского селектора шаблонов.
- Создайте пользовательский DataGridBoundColumn и переопределите GenerateElement.
- В GenerateElement вернуть ContentControl. Вы должны связать свойство Content этого ContentControl, используя свойство Binding вашего пользовательского столбца.
- Если вы используете неявные шаблоны данных, на этом все готово.
- Если вы используете свой собственный DataGridCellTemplateSelector, просто используйте его вместо простого ContentControl, упомянутого выше.
Неявные шаблоны данных выглядят так (обратите внимание, что они являются ресурсами без x:Key):
<UserControl.Resources>
<DataTemplate DataType="ViewModel:Contact">
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding City}"/>
</StackPanel>
</DataTemplate>
</UserControl.Resources>