2017-10-18 13 views
3

Je voudrais utiliser WPF Appliquer le convertisseur à la valeur de liaison à tous les DataGridTextColumn dans l'application.WPF - Comment appliquer un convertisseur à tous DataGridTextColumn?

Pour simple convertisseur de DataGridTextColumn fonctionne bien:

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

Mais dans l'application, je me suis beaucoup (plus de 100) DataGridTextColumn dans différents de DataGrid et je ne saurais meilleure solution pour qu'au lieu d'appliquer pour chaque colonnes convertisseur séparément.

Je sais en utilisant le style il est possible de modifier certaines propriétés pour tous les types de contrôles (par exemple au premier plan) mais je ne sais pas comment les utiliser pour la valeur de liaison et le convertisseur?

+0

Dans mon cas, quand un problème similaire a surgi, j'ai fini par modifier chacun comme dans votre échantillon, puis CHASSING vers le bas des restes. Boring et erreur sujettes, mais ne peut pas penser à quelque chose de mieux avec WPF. – Alejandro

+0

Donc, vous voulez ajouter un convertisseur trop tous les DataGridTextColumn.Bindings, même non-décimal? – Evk

+0

Styler un DataGridTextColumn n'est pas si simple. [DataGridTextColumn] (https://msdn.microsoft.com/fr-fr/library/system.windows.controls.datagridtextcolumn (v = vs.110) .aspx) n'hérite pas de FrameworkElement. – Link

Répondre

1

Vous pouvez le faire avec l'aide du style global et de la propriété jointe. Vous ne pouvez pas créer de style global (ou de style) pour DataGridTextColumn car il n'hérite pas de FrameworkElement. Mais vous pouvez créer le style pour DataGrid lui-même, définir la propriété jointe pour la grille dans ce style, et dans la propriété a changé le gestionnaire de ce jeu de propriétés jointes pour toutes les liaisons de colonnes lors de leur ajout. Exemple de code:

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; 
        } 
       } 
      } 
     }; 
    } 
} 

Ensuite, créez un style global, quelque part (comme App.xaml):

<Application.Resources> 
    <local:TestConverter x:Key="decimalConverter" /> 
    <Style TargetType="DataGrid"> 
     <Setter Property="local:DataGridHelper.Converter" 
       Value="{StaticResource decimalConverter}" /> 
    </Style> 
</Application.Resources> 
+0

Cela a fonctionné parfaitement bien pour moi! Merci pour la solution rapide. – Kaspar