2010-08-11 3 views
3

Je suis en train de concevoir un contrôle utilisateur pour afficher une note. J'ai donc un NoteViewModel. Dans mon concepteur, je veux avoir une note de test. J'ai donc ce qui suit dans mon XAML:Données de test XAML - le concepteur peut convertir les types mais le moteur d'exécution ne peut pas

<UserControl.Resources> 
    <local:NoteViewModel x:Key="ViewModel" d:IsDataSource="True"> 
     <local:NoteViewModel.Note> 
      <localweb:Note 
       NoteID="1" 
       CreatedBy="Some Guy" 
       CreatedDate="2010-01-01 8:00 AM" 
       Category="Some Category" 
       NoteText="Some Text" 
       /> 
     </local:NoteViewModel.Note> 
    </local:NoteViewModel> 
</UserControl.Resources> 

Cela fonctionne très bien au moment du design. Mais à l'exécution, je reçois des erreurs de ne pas être en mesure de convertir "1" en un Int32, et ne pas être en mesure de convertir "2010-01-01 8:00 AM" en un DateTime. Pourquoi le concepteur est-il capable de gérer cela, mais pas l'exécution? Comment devrais-je changer mon XAML pour que le concepteur puisse montrer la note de test mais l'exécution ne plante pas?

+0

L'erreur sur la conversion de "1" en Int32 est particulièrement déroutante. Comment la propriété NoteID est-elle déclarée? Pouvez-vous révéler le code pour cela? –

+0

Oui, le code NoteId pourrait donner quelques indices. Moi j'ai eu un problème étrange comme ci-dessus. Il pourrait y avoir des convertisseurs utilisés à l'intérieur du style. Silverlight ne détectera pas cela. Depuis, le style n'aura pas DataContext. Je suis venu avec une réponse filaire pour la partialité entre le temps de conception silverlight et run-time. Le concepteur est basé sur WPF. –

Répondre

0

Le concepteur est souvent plus indulgent que le parseur Xaml standard.

Je n'arrive pas à comprendre pourquoi il ne peut pas convertir "1" en Int32 car int est l'un des rares types primitifs qui analysent nativement Xaml. Vous auriez besoin pour décorer votre propriété avec CreatedDateTypeConverterAttribute: -

[TypeConverterAttribute(typeof(DateTimeTypeConverter))] 
public CreatedDate { get; set; } 

sans que cela l'analyseur XAML ne sait pas vraiment quoi faire avec la date. Cela devient pire dans la mesure où le concepteur utilisera la culture d'interface utilisateur standard pour déterminer comment analyser la date alors que Xaml utilisera souvent quelque chose de différent. J'ai trouvé ce problème particulier assez intraitable.

+0

DateTimeTypeConverter est dans System.Windows.Controls. Êtes-vous en train de dire que je devrais faire référence à cela dans mon niveau de logique métier pour décorer la classe? Cela semble ... malheureux. – RationalGeek

+0

@jkohilhepp: 'TypeConverterAttribute' a un autre constructeur qui prend le nom du type à utiliser comme convertisseur, donc vous pouvez utiliser cette alternative pour éviter d'avoir une référence supplémentaire. – AnthonyWJones

1

Je ne sais pas pourquoi cela se produit, mais pour résoudre le problème avec l'Int, vous pouvez essayer de spécifier le type de la valeur pour NoteID:

<localweb:Note xmlns:sys="clr-namespace:System;assembly=mscorelib" ...> 
     <localweb:Note.NoteID><sys:Int32>1</sys:Int32></localweb:Note.NoteID> 
    </localweb:Note> 

Un peu long, mais devrait probablement travailler .

+0

Eh bien, ça fait assez longtemps que je ne pense pas pouvoir recréer le scénario exact pour le tester rapidement. Mais puisque cela semble être une bonne suggestion, je vais vous donner la prime. :-) Merci. – RationalGeek

+0

Merci, c'était ma première prime. :) –

Questions connexes