Я собираю некоторые общие стили 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 - но я не могу видеть, как это сделать
.Любая идея, как это сделать?
Это сложный вопрос, возможно, идея могла бы заключаться в создании класса ParameterizedDataGridTemplateColumn, добавляющего только DependencyProperty, называемый ContentBindingName, а затем использование связывания источников-источников внутри datatemplate. Это будет сложно, хотя, поскольку наследование DataGridTemplateColumn не очень просто – jimmyjambles