gpt4 book ai didi

c# - WPF - 如何将转换器应用于所有 DataGridTextColumn?

转载 作者:行者123 更新时间:2023-11-30 12:39:20 25 4
gpt4 key购买 nike

我想使用 WPF Apply Converter to Binding Value 到应用程序中的所有 DataGridTextColumn。

对于正常工作的单个 DataGridTextColumn 转换器:

<DataGridTextColumn 
Header ="Value"
Binding="{Binding Value, Converter={StaticResource decimalConverter}}"
/>

但在应用程序中,我在不同的 DataGrid 中得到了很多(超过 100 个)DataGridTextColumn,我知道最好的解决方案,而不是分别申请每个列转换器。

我知道使用 Style 可以修改所有控件类型(例如前景)的某些属性,但不确定如何将这些用于绑定(bind)值和转换器?

最佳答案

您可以借助全局样式和附加属性来完成。您不能为 DataGridTextColumn 创建全局样式(或任何样式),因为它不继承自 FrameworkElement。但是您可以为 DataGrid 本身创建样式,以该样式为网格设置附加属性,并在附加属性的属性更改处理程序中为所有列绑定(bind)设置转换器。示例代码:

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>

关于c# - WPF - 如何将转换器应用于所有 DataGridTextColumn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46818329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com