15

Devo creare una nuova proprietà per i controlli WPF esistenti (casella di gruppo, casella di testo, casella di controllo, ecc.), Che memorizzerà il suo livello di accesso, quindi Ho scoperto Proprietà allegate. ho usato come esempio questo sito http://dotnetbyexample.blogspot.com.br/2010/05/attached-dependency-properties-for.htmlProprietà associate al C# WPF - Errore: "La proprietà non esiste nello spazio dei nomi XML"

Tutto è andato bene, ma poi ho ottenuto il seguente errore quando si tenta di utilizzarlo su un certo controllo ...

Error 1 The property 'DependencyPropertiesHoster.AcessLevel' does not exist in XML namespace 'clr-namespace:ImageGUI.App_Code;assembly=ImageGUI'. Line 131 Position 97. ImageGUI\MainWindow.xaml 131 97 ImageGUI

Questo è il mio C# frammento di codice ...

namespace ImageGUI.App_Code 
{  
    public static class DependencyPropertiesHoster 
    { 
    //[AttachedPropertyBrowsableForChildren] 
    public static readonly DependencyProperty AcessLevelProperty = 
     DependencyProperty.RegisterAttached("AcessLevel", 
     typeof(EAcessLevel), 
     typeof(DependencyPropertiesHoster), 
     new PropertyMetadata(AcessLevelChanged)); 

    // Called when Property is retrieved 
    public static EAcessLevel GetAcessLevel(DependencyObject obj) 
    { 
     if (obj != null) 
      return (EAcessLevel)obj.GetValue(AcessLevelProperty); 
     else 
      return EAcessLevel.Client; 
     //return obj.GetValue(AcessLevelProperty) as EAcessLevel; 

    } 

    // Called when Property is set 
    public static void SetAcessLevel(
     DependencyObject obj, 
     EAcessLevel value) 
    { 
     obj.SetValue(AcessLevelProperty, value); 
    } 

    // Called when property is changed 
    private static void AcessLevelChanged(
    object sender, 
    DependencyPropertyChangedEventArgs args) 
    { 
     var attachedObject = sender as UIElement; 
     if (attachedObject != null) 
     { 
      // do whatever is necessary, for example 
      // attachedObject.CallSomeMethod(     
      // args.NewValue as TargetPropertyType); 
     } 
    } 
} 

}

Qui è la mia dichiarazione alla finestra

xmlns:CustomDepen="clr-namespace:ImageGUI.App_Code;assembly=ImageGUI" 

e qui è il mio utilizzo della proprietà (in cui l'errore si trova ...)

<GroupBox Name="gbApplications" Header="{DynamicResource applications}" CustomDepen:DependencyPropertiesHoster.AcessLevel="Client"> 

Osservazione: EAcessLevel è solo una semplice enumerazione.

Grazie in anticipo.

+3

Sei sicuro che 'AcessLevel' è nell'assembly' ImageGUI'? Funziona se rimuovi la parte 'assembly = ImageGUI' della tua dichiarazione? –

+3

+1 per qualcuno che finalmente include informazioni sufficienti in una domanda SO. Per aggiungere al commento di @ Bob, se la tua proprietà allegata (o qualsiasi altra cosa) è nello stesso assembly di XAML, non dovresti includere la parte 'assembly =' del tuo mapping di spazio dei nomi CLR XML->. –

+0

Grazie! Non posso credere che fosse così semplice, ma sono contento che lo sia stato. Solo la rimozione della parte finale lo ha risolto (assembly = ...). Ma mi chiedo come accedo questa proprietà nel codice? Come lo recupererei in modo programmatico ora? esempio di scenario perfetto: EAcessLevel controlAcess = gbApplications.AcessLevel; – Luishg

risposta

14

Grazie Bob e Kent per le risposte, questo ha praticamente risolto il problema. In questo scenario, solo cambiando

xmlns:CustomDepen="clr-namespace:ImageGUI.App_Code;assembly=ImageGUI" 

a

xmlns:CustomDepen="clr-namespace:ImageGUI.App_Code" 

fissata la situazione. Tutto il resto era corretto.

Per quanto riguarda l'altro mio commento su come recuperare il valore specificato, sarebbe così:

EAcessLevel currentAcess = (EAcessLevel)gbApplications.GetValue(DependencyPropertiesHoster.AcessLevelProperty); 

Grazie, e spero che aiuta anche qualcuno in futuro.