DataGridCell селектор шаблонов контента Silverlight - PullRequest
3 голосов
/ 26 сентября 2011

У меня есть 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 Ответ

0 голосов
/ 14 декабря 2012
  • Попробуйте использовать неявные шаблоны данных вместо пользовательского селектора шаблонов.
  • Создайте пользовательский DataGridBoundColumn и переопределите GenerateElement.
  • В GenerateElement верните ContentControl.Вы должны связать свойство Content этого ContentControl, используя свойство Binding вашего пользовательского столбца.
    • Если вы используете неявные шаблоны данных, все готово.
    • Если вы используете собственный DataGridCellTemplateSelector, просто используйте его вместо простого ContentControl, упомянутого выше.

Неявные шаблоны данных выглядят так (обратите внимание, что они являются ресурсами без ключа x:):

<UserControl.Resources>
    <DataTemplate DataType="ViewModel:Contact">
        <StackPanel>
            <TextBlock Text="{Binding Name}"/>
            <TextBlock Text="{Binding City}"/>
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...