0

Je tente de créer un AttachedProperty pour un DataGridColumn dans Silverlight 3.0 et j'ai quelques problèmes.Silverlight DataGridColumn AttachedProperties

Voici le AttachedProperty:

public class DataGridColumnHelper 
{ 
    public static readonly DependencyProperty HeaderProperty = 
     DependencyProperty.RegisterAttached("Header", typeof(string), typeof(DataGridColumnHelper), 
              new PropertyMetadata(OnHeaderPropertyChanged)); 

    private static void OnHeaderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     string header = GetHeader(d); 

     var dataGridColumn = d as DataGridColumn; 

     if (dataGridColumn == null) 
     { 
      return; 
     } 

     dataGridColumn.Header = GetHeader(dataGridColumn); 
    } 

    public static string GetHeader(DependencyObject obj) 
    { 
     return (string)obj.GetValue(HeaderProperty); 
    } 

    public static void SetHeader(DependencyObject obj, string value) 
    { 
     obj.SetValue(HeaderProperty, value); 
    } 

} 

Comme vous pouvez le voir est très simple, je tente de surmonter la limitation que la propriété en-tête dans la classe DataGridColumn ne peut pas être lié.

Ce XAML fonctionne comme prévu ...

<Controls:DataGridTextColumn Binding="{Binding OwnerName}"                   
         HeaderStyle="{StaticResource DataGridColumnHeaderStyle}" 

         Behaviors:DataGridColumnHelper.Header="User Name"/> 

Cependant, cette XAML renvoie une erreur ... (Plus précisément: {System.Windows.Markup.XamlParseException: AG_E_PARSER_PROPERTY_NOT_FOUND [Ligne: 224 Position: 112] à System.Windows.Application.LoadComponent (composant Object, Uri resourceLocator) ....})

<Controls:DataGridTextColumn Binding="{Binding OwnerName}"                   
         HeaderStyle="{StaticResource DataGridColumnHeaderStyle}" 

         Behaviors:DataGridColumnHelper.Header="{Binding Resources.UserNameListViewHeading, Source={StaticResource Labels}}"/> 

Juste pour l'expérimentation que j'attachais cette propriété (avec la syntaxe de liaison ci-dessus) à un DataGrid et vérifié la propriété DataGridColumnHelper.Header dans la méthode OnHeaderPropertyChanged et la valeur était correcte (et une exception n'a pas été moulinée)

Je crois comprendre que l'objet que le AttachedProperty est attaché à doit être un DependencyProperty. En regardant à travers le réflecteur, DataGridColumn (dont dérive DataGridTextColumn) dérive de DependencyProperty.

Quelqu'un peut-il faire la lumière sur ce sujet? J'essaie de localiser notre application, et j'ai des problèmes avec le DataGrid. Je suis sûr que je peux le faire en code-behind, mais j'essaie d'éviter cela.

Répondre

1

Chris, le problème est très simple, cela ne fonctionnera pas car DataGridTextColumn est "détaché" de l'arborescence Visual. Votre objet DataGridTextColumn est ancré dans la collection Columns du DataGrid - voir l'indirection. Donc même les propriétés attachées ne fonctionneront pas comme prévu. Maintenant, il y a un moyen de faire tout ce travail en utilisant quelque chose que je vous appelle Manchettes ci-joint, voir:

http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight-(Part-I).aspx

Rappelez-vous simplement pour fixer les propriétés de liaison à l'aide de quelque chose qui est dans le VisualTree (donc la grille tenant la colonne ferait très bien.)

Espérons que cela aide.

+0

J'ai suivi vos messages sur la boîte à outils nRoute, et j'ai hâte de l'expérimenter. Merci pour la réponse descriptive. –

+0

Qu'en est-il de Run in Silverlight? La propriété attachée avec la liaison sur Exécuter ne fonctionne pas dans SIlverlight ... –

0

Essayez d'utiliser ce, im en supposant UserName est une propriété dans votre viewmodel

<Controls:DataGridTextColumn Binding="{Binding OwnerName}"                   
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}" 
Behaviors:DataGridColumnHelper.Header="{Binding UserName}"/> 

Je ne peux pas tester votre scénario si mon post est juste une idée. Ça pourrait marcher, peut-être pas.

+0

La liaison que j'essaie d'utiliser provient d'un fichier de ressources, car nous localisons nos chaînes. La liaison d'un DataGridTextColumn est basée sur la source Items (en supposant que nous ne spécifions pas de source comme je l'ai fait dans l'exemple ci-dessus), donc le DataContext n'est pas le même que le DataGrid. Merci –