WPF - 如何将转换器应用于所有 DataGridTextColumn?
WPF - How to apply converter to all DataGridTextColumn?
我想使用 WPF Apply Converter to Binding Value 到应用程序中的所有 DataGridTextColumn。
对于单个 DataGridTextColumn 转换器工作正常:
<DataGridTextColumn
Header ="Value"
Binding="{Binding Value, Converter={StaticResource decimalConverter}}"
/>
但在应用程序中,我在不同的 DataGrid 中有很多(超过 100 个)DataGridTextColumn,我知道最好的解决方案,而不是分别申请每个列转换器。
我知道使用 Style 可以为所有类型的控件(例如前景)修改一些 属性 但不确定如何将这些用于绑定值和转换器?
您可以借助全局样式和附件 属性 来完成。您不能为 DataGridTextColumn
创建全局样式(或任何样式),因为它不继承自 FrameworkElement
。但是您可以为 DataGrid
本身创建样式,为该样式的网格设置附加 属性,并在 属性 中更改附加的处理程序 属性 为所有列绑定设置转换器他们被添加。示例代码:
public class DataGridHelper : DependencyObject {
public static IValueConverter GetConverter(DependencyObject obj) {
return (IValueConverter) obj.GetValue(ConverterProperty);
}
public static void SetConverter(DependencyObject obj, IValueConverter value) {
obj.SetValue(ConverterProperty, value);
}
public static readonly DependencyProperty ConverterProperty =
DependencyProperty.RegisterAttached("Converter", typeof(IValueConverter), typeof(DataGridHelper), new PropertyMetadata(null, OnConverterChanged));
private static void OnConverterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
// here we have our converter
var converter = (IValueConverter) e.NewValue;
// first modify binding of all existing columns if any
foreach (var column in ((DataGrid) d).Columns.OfType<DataGridTextColumn>()) {
if (column.Binding != null && column.Binding is Binding)
{
((Binding)column.Binding).Converter = converter;
}
}
// then subscribe to columns changed event and modify binding of all added columns
((DataGrid) d).Columns.CollectionChanged += (sender, args) => {
if (args.NewItems != null) {
foreach (var column in args.NewItems.OfType<DataGridTextColumn>()) {
if (column.Binding != null && column.Binding is Binding) {
((Binding) column.Binding).Converter = converter;
}
}
}
};
}
}
然后在某处创建全局样式(如App.xaml):
<Application.Resources>
<local:TestConverter x:Key="decimalConverter" />
<Style TargetType="DataGrid">
<Setter Property="local:DataGridHelper.Converter"
Value="{StaticResource decimalConverter}" />
</Style>
</Application.Resources>
我想使用 WPF Apply Converter to Binding Value 到应用程序中的所有 DataGridTextColumn。
对于单个 DataGridTextColumn 转换器工作正常:
<DataGridTextColumn
Header ="Value"
Binding="{Binding Value, Converter={StaticResource decimalConverter}}"
/>
但在应用程序中,我在不同的 DataGrid 中有很多(超过 100 个)DataGridTextColumn,我知道最好的解决方案,而不是分别申请每个列转换器。
我知道使用 Style 可以为所有类型的控件(例如前景)修改一些 属性 但不确定如何将这些用于绑定值和转换器?
您可以借助全局样式和附件 属性 来完成。您不能为 DataGridTextColumn
创建全局样式(或任何样式),因为它不继承自 FrameworkElement
。但是您可以为 DataGrid
本身创建样式,为该样式的网格设置附加 属性,并在 属性 中更改附加的处理程序 属性 为所有列绑定设置转换器他们被添加。示例代码:
public class DataGridHelper : DependencyObject {
public static IValueConverter GetConverter(DependencyObject obj) {
return (IValueConverter) obj.GetValue(ConverterProperty);
}
public static void SetConverter(DependencyObject obj, IValueConverter value) {
obj.SetValue(ConverterProperty, value);
}
public static readonly DependencyProperty ConverterProperty =
DependencyProperty.RegisterAttached("Converter", typeof(IValueConverter), typeof(DataGridHelper), new PropertyMetadata(null, OnConverterChanged));
private static void OnConverterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
// here we have our converter
var converter = (IValueConverter) e.NewValue;
// first modify binding of all existing columns if any
foreach (var column in ((DataGrid) d).Columns.OfType<DataGridTextColumn>()) {
if (column.Binding != null && column.Binding is Binding)
{
((Binding)column.Binding).Converter = converter;
}
}
// then subscribe to columns changed event and modify binding of all added columns
((DataGrid) d).Columns.CollectionChanged += (sender, args) => {
if (args.NewItems != null) {
foreach (var column in args.NewItems.OfType<DataGridTextColumn>()) {
if (column.Binding != null && column.Binding is Binding) {
((Binding) column.Binding).Converter = converter;
}
}
}
};
}
}
然后在某处创建全局样式(如App.xaml):
<Application.Resources>
<local:TestConverter x:Key="decimalConverter" />
<Style TargetType="DataGrid">
<Setter Property="local:DataGridHelper.Converter"
Value="{StaticResource decimalConverter}" />
</Style>
</Application.Resources>