首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将转换器应用于所有DataGridTextColumn?

如何将转换器应用于所有DataGridTextColumn?
EN

Stack Overflow用户
提问于 2017-10-18 20:04:04
回答 1查看 1.6K关注 0票数 5

我想使用WPF应用转换器绑定到应用程序中的所有DataGridTextColumn值。

对于工作良好的单个DataGridTextColumn转换器:

代码语言:javascript
运行
复制
<DataGridTextColumn 
    Header ="Value" 
    Binding="{Binding Value, Converter={StaticResource decimalConverter}}" 
    />

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-18 20:58:51

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

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
<Application.Resources>
    <local:TestConverter x:Key="decimalConverter" />
    <Style TargetType="DataGrid">
        <Setter Property="local:DataGridHelper.Converter"
                Value="{StaticResource decimalConverter}" />
    </Style>
</Application.Resources>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46818329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档