Один из способов сделать это - установить триггеры в коде позади.Следующий метод применяет триггер к DataGridColumn.Этот триггер использует ваш IsNumericConverter
, чтобы определить, следует ли выполнить выравнивание по правому краю:
public static void AddTriggerToColumnStyle(DataGridColumn column)
{
var boundColumn = column as DataGridBoundColumn;
if (boundColumn != null && boundColumn.Binding is Binding)
{
string bindingPropertyPath = (boundColumn.Binding as Binding).Path.Path;
column.CellStyle = new Style()
{
BasedOn = column.CellStyle,
TargetType = typeof(DataGridCell),
Triggers =
{
new DataTrigger
{
Binding = new Binding(bindingPropertyPath) { Converter = new IsNumericConverter() },
Value = true,
Setters =
{
new Setter
{
Property = TextBlock.TextAlignmentProperty,
Value = TextAlignment.Right
}
}
}
}
};
}
}
Этот метод должен быть безопасно вызываться после InitializeComponent()
в конструкторе выделенного кода.
Этот подход будет работать, если столбец содержит смесь числовых и нечисловых данных.Если столбцы содержат данные только одного типа, то этот подход все равно будет работать, но созданные триггеры либо никогда не сработают, либо останутся запущенными постоянно.
Конечно, вышеупомянутый метод не должен повторяться вкод для каждого элемента управления, который использует DataGrids.Вы можете переместить его в статический служебный класс, и все ваши классы кода будут вызывать этот метод.Вы даже можете добавить метод статической утилиты, который проходит по столбцам в DataGrid, который вы передаете, и вызывает вышеупомянутый метод для каждого столбца.
UPDATE : я изменил вышеупомянутый метод, чтобы разрешить еговывести обязательный путь-свойства.Это облегчает использование.Я также сделал метод public
и static
, чтобы было понятно, что его можно переместить в статический служебный класс.
Я подумал о другом подходе, который будет проходить через все столбцы вDataGrid, проверяйте привязки, определяйте тип привязанного свойства и применяйте выравнивание по столбцу по правому краю.Это позволит избежать создания триггеров, которые никогда не сработают или останутся постоянно запущенными, и, возможно, подойдет для случая, когда каждый столбец содержит данные одного типа только немного лучше.Тем не менее, этот подход по-прежнему будет включать в себя выделение кода, ему необходимо будет передать тип, к которому будет привязана каждая строка, и он будет усложнен, если пути привязки свойств будут включать в себя нечто большее, чем одно имя свойства.
Боюсь, я не вижу решения этой проблемы, которое использует только Style
s и избегает кода позади.