Non usate “Name” invano!

Anche se taciturno volevo rassicura e il mondo che sono ancora vivo. In questo periodo la mia attenzione è su sviluppi e corsi Silverlight sia per progetti interni di ManagedDesigns sia per commesse esterne presso clienti vari. Ed ecco che oggi mi sono imbattuto in un “simpatico" bug” del designer (?) Xaml per Silverlight su VS2010 - verificato in primis su VS2008. Non lo considero un problema bloccante... ma notificarlo credo non sia male, potrebbe far risparmiare tempo e grattacapi inutili. Dopo una prima ricerca veloce ho visto che nessuno ne parla in rete, quindi riporto di seguito il problema e come verificarlo.

1) Definisco un Attached Property di nome “Name”. Capisco che qualcuno si potrebbe chiedere se non potevo scegliere si da subito un altro nome, ma applicato al mio caso reale “Name” sarebbe stato perfetto.

public class Testing
{
    public static string GetName(DependencyObject obj)
    {
        return (string)obj.GetValue(NameProperty);
    }

    public static void SetName(DependencyObject obj, string value)
    {
        obj.SetValue(NameProperty, value);
    }

    public static readonly DependencyProperty NameProperty =
        DependencyProperty.RegisterAttached(
        "Name",
        typeof(string),
        typeof(Testing),
        new PropertyMetadata(string.Empty));

}

2) Applico “Name” nello Xaml.

<TextBlock local:Testing.Name="tbTestLoc" Name="tbTest" />

Il risultato è che vengono creati dal generatore automatico due riferimenti all’oggetto nel codice.

internal System.Windows.Controls.TextBlock tbTestLoc;

internal System.Windows.Controls.TextBlock tbTest;

In realtà solo uno viene poi correttamente legato a runtime (tbTest). Ovviamente workaround è semplice: non nominare le Attached Property “Name”; ma nel caso servisse si ha come effetto collaterale – oltre alle variabili inutilmente definite – che non è possibile avere due o più controlli lo stesso valore della proprietà  in quanto questo generebbe variabili nel “codebehind” con lo stesso nome. Inoltre il valore della proprietà personalizzata oltre che andare in conflitto con se stessa potrebbe andare in conflitto anche con i valori della proprietà “Name” (x:Name su SL3). In pratica sembra che il generatore del code behind non tenga conto dei namespace della proprietà. Ho fatto qualche test e fortunatamente la cosa mi sembra sia relativa esclusivamente alla sola proprietà “Name”.

Ho aperto una segnalazione su Microsoft Connect nel caso la volesse supportare, [SL] Any attached property named "Name" generates a reference to the control ;)

oO0( non usate “Name” invano... almeno per ora!)

posted @ lunedì 5 luglio 2010 18:28

Print
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011