Question

J'essaie de créer un AttachedProperty pour un DataGridColumn dans Silverlight 3.0 et j'ai des problèmes.

Voici la propriété attachée:

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 constater, c’est très simple, j’essaie de surmonter la limitation selon laquelle la propriété Header de la classe DataGridColumn ne peut pas être liée.

Ce XAML fonctionne comme prévu ...

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

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

Cependant, ce code XAML génère une erreur ... (plus précisément: {System.Windows.Markup.XamlParseException: AG_E_PARSER_PROPERTY_NOT_FOUND [Ligne: 224 Position: 112]    at System.Windows.Application.LoadComponent (composant d'objet, Uri resourceLocator)    ....})

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

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

Juste pour expérimenter, j'ai attaché cette propriété (avec la syntaxe de liaison ci-dessus) à un DataGrid et vérifié la propriété DataGridColumnHelper.Header dans le OnHeaderPropertyChanged méthode et la valeur était correcte (et une exception n'a pas été levée)

Je crois comprendre que l’objet auquel AttachedProperty est attaché doit être un DependencyProperty . En parcourant Reflector, DataGridColumn (duquel dérive DataGridTextColumn ) provient de DependencyProperty .

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

Était-ce utile?

La solution

Chris, le problème est très simple, cela ne fonctionnera pas car DataGridTextColumn est " détaché " de l'arbre visuel. Votre objet DataGridTextColumn est enraciné dans la collection Columns de DataGrid - voir l'indirection. Ainsi, même les propriétés attachées ne fonctionneront pas comme prévu. Maintenant, il existe un moyen de faire fonctionner tout ce travail en utilisant quelque chose que j'appelle attachés, voir:

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

N'oubliez pas d'attacher les propriétés de liaison en utilisant quelque chose qui se trouve dans VisualTree (pour que la grille contenant la colonne convienne parfaitement).

J'espère que cela vous aidera.

Autres conseils

Essayez d’utiliser ceci, en supposant que UserName est une propriété de votre modèle de vue

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

Je ne peux pas tester votre scénario, mon message n'est donc qu'une idée. Pourrait fonctionner, peut-être pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top