2010-05-18 4 views
0

J'ai défini une commande avec:F # Silverlight 3.0 Contrôle propriété personnalisée lance: NullReferenceException

static member ItemsProperty : DependencyProperty = 
     DependencyProperty.Register(
      "Items", 
      typeof<MyMenuItemCollection>, 
      typeof<MyMenu>, 
      null); 

member this.Items 
     with get() : MyMenuItemCollection = this.GetValue(MyMenu.ItemsProperty) :?> MyMenuItemCollection 
     and set (value: MyMenuItemCollection) = this.SetValue(MyMenu.ItemsProperty, value); 

Le problème se produit sur l'accès:

for menuItem in this.Items do 
    let contentElement: FrameworkElement = menuItem.Content 

où je reçois une exception de référence null sur cette .Articles;

'articles' ont jeté une exception de type 'System.NullReferenceException'

Immédiatement après avoir initialisé dans le constructeur:

do 
    this.Items <- new CoolMenuItemCollection() 
+0

Salut, ce n'est pas un forum de discussion jusqu'à un lieu pour les questions et les réponses. Supposons que quelqu'un qui consulte votre message n'a pas lu votre "post précédent" –

+0

assez vrai - coupable de taper à haute voix. Le post précédent est complètement irrelavent. – akaphenom

Répondre

1

Je pense que le problème est que static member dans F # ne correspond pas au domaine public comme vous l'avez peut-être prévu, mais à une propriété avec get membre. Cela signifie que chaque fois que vous activez this.ItemsProperty, vous créez réellement une nouvelle propriété de dépendance.

Vous pouvez créer un champ statique comme ceci:

type Control = 
    // private static field 
    static let itemsProperty : DependencyProperty = 
    DependencyProperty.Register 
     ("Items", typeof<MyMenuItemCollection>, typeof<MyMenu>, null); 
    // public static property with getter 
    static member ItemsProperty = itemsProperty 

    // You can use both private 'itemsProperty' field or public property here 
    member this.Items 
    with get() : MyMenuItemCollection = 
     this.GetValue(itemsProperty) :?> MyMenuItemCollection 
    and set (value: MyMenuItemCollection) = 
     this.SetValue(itemsProperty, value) 
+0

Il a corrigé l'exception NullReference. Je pense que je devrai rechercher un peu plus le modificateur statique en F #; le contrôle ne produit toujours pas de sortie - mais je vais de l'avant. Je vous remercie – akaphenom

0

Le getter CLR est pas appelé par la plupart des le cadre. C'est pour la commodité de l'accès des développeurs est le code derrière les fichiers.

À l'intérieur de votre constructeur serait un bon endroit pour initialiser la collection si vous en avez besoin. Ne pas définir une valeur par défaut (null dans votre déclaration de propriété de dépendance ci-dessus) à une collection vide. La valeur par défaut est une instance statique unique et partagée. Ainsi, chaque instance de votre contrôle partage la même liste, et non ce que vous souhaitez.

+0

Merci; Je suis en train de me reconfigurer avec .NET en écrivant une application Silverlight en 100% F #. Son prouver être un plus grand projet que prévu. DependencyProperty.Register montre deux signatures sur MSDN - cependant mon intellisense montre seulement une signature simple, qui prend quatre paramètres. Est-ce que je manque quelque chose? Ou cela pourrait-il être F # mélanger les sigs? – akaphenom

+0

Cela ne devrait pas importer - votre déclaration de propriété de dépendance Register est déjà correcte. –

+0

C'est ce que je pensais à l'origine mais je rencontre des problèmes car le code comme indiqué jette l'exception NullReference ... Donc je pense que somehting doit être désactivé – akaphenom

Questions connexes