2012-06-29 3 views
4

Я собираю некоторые общие стили CellTemplate для сетки WPF (WPFToolKit DataGrid), и я не уверен в синтаксисе, используемом для создания общего типа привязки. Так, например, у меня есть шаблон, который превращает значение красного цвета, если значение отрицательное:Можно ли параметризовать привязку на DataGrid CellTemplate в ресурсе?

<DataTemplate x:Key="RedNegativeCellTemplate"> 
    <TextBlock Name="QuantityTextBox" Text="{Binding Quantity, StringFormat='c', Mode=OneWay}"/> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Quantity, Converter={StaticResource SignConverter}}" Value="-1"> 
      <Setter TargetName="QuantityTextBox" Property="Foreground" Value="Red"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

Вы заметите, что это имеет привязку на текстовое поле значение столбца «Количество» - т.е. поле/столбец, из которого происходит привязка, является явным.

Так что я могу использовать это в моем WPF DataGrid следующим образом:

<sdk:DataGrid ItemsSource="{Binding MyDataSource}" AutoGenerateColumns="False"> 
    <sdk:DataGrid.Columns> 

     <sdk:DataGridTemplateColumn Header="Net Quantity" CellTemplate="{StaticResource RedNegativeCellTemplate}"/> 

    </sdk:DataGrid.Columns> 
</sdk:DataGrid> 

... Но то, что я действительно хотел сделать, это иметь обязательный общий для шаблона поля, так что я могу повторно использовать шаблон следующим образом:

<sdk:DataGrid ItemsSource="{Binding OrdersQuery}"AutoGenerateColumns="False"> 
    <sdk:DataGrid.Columns> 
     <sdk:DataGridTemplateColumn Header="Quantity" CellTemplate="{StaticResource RedNegativeCellTemplate}"/> 
     <sdk:DataGridTemplateColumn Header="Price" CellTemplate="{StaticResource RedNegativeCellTemplate}"/> 
     <sdk:DataGridTemplateColumn Header="Total" CellTemplate="{StaticResource RedNegativeCellTemplate}"/> 
    </sdk:DataGrid.Columns> 
</sdk:DataGrid> 

Теперь проблема в том, что там, кажется, не быть способ параметризировать связывания в CellTemplate. Но я не хочу иметь 3 + строки контрольной таблицы для каждый столбец, который использует этот шаблон, поскольку он загромождает XAML и делает его гораздо менее удобочитаемым (не говоря уже о том, что если я решит изменить шаблон ячейки чтобы поместить границу вокруг текстового поля, мне пришлось бы изменить его в нескольких местах.

Так что я думаю, что привязка в CellTemplate должна выглядеть примерно так (обратите внимание, что мы используем «.» для связывании путь):

  Text="{Binding Path=., StringFormat='c', Mode=OneWay}" 

а потом каким-то образом установить DataContext из декларации DataGridTemplateColumn - но я не могу видеть, как это сделать

.

Любая идея, как это сделать?

+0

Это сложный вопрос, возможно, идея могла бы заключаться в создании класса ParameterizedDataGridTemplateColumn, добавляющего только DependencyProperty, называемый ContentBindingName, а затем использование связывания источников-источников внутри datatemplate. Это будет сложно, хотя, поскольку наследование DataGridTemplateColumn не очень просто – jimmyjambles

ответ

0

Для этого вы можете использовать DataTemplateSelector, что на самом деле довольно просто реализовать.
Если вам нужны дополнительные пояснения и примеры - сообщите мне.

+0

О, это здорово. Итак, по существу напишите DataTemplateSelector и назначьте его CellTtemplateSelector в XAML, и он может программно применить правильный шаблон на основе некоторой логики? Проблема только в том, что логика должна быть в коде в DataTemplateSelector, или можно определить ее в XAML с помощью триггеров или чего-то подобного? Если у вас есть примеры, я был бы очень благодарен. – Webreaper

1

@Webreaper: Если я правильно понимаю вашу идею, то мы с вами сталкиваемся с тем же материалом. Я не пробовал свою версию решения, в основном, я привяжу свойство path к привязке к SortMemberPath DataGridTemplateColumn.

<DataGrid> 
.... 
    <DataGridTemplateColumn CellTemplate={StaticResource CellTemplateKey} /> 
.... 
</DataGrid> 

Где CellTemplateKey определяется где-то (в App.xaml, например):

<DataTemplate x:Key="CellTemplateKey"> 
    <TextBlock Binding="{Binding Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}, Path={Binding Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTemplateColumn, Path=SortMemberPath}}}}" /> 
</DataTemplate> 

Я буду проверять и обновлять это позже. Надеюсь, эта идея будет полезной. Я могу заглянуть в Dyna

Смежные вопросы