2009-11-24 15 views
1

Je travaille sur un ensemble de contrôles possédant un certain nombre de DependencyProperties. Les propriétés sont elles-mêmes DependencyObjects et créées lors de la méthode get des propriétés. Au cours de la méthode Get, ils sont également définis dans le Propertybag à l'aide de la méthode SetValue(), ils sont donc valides dans Xaml et leurs propriétés peuvent être storyboardées sans avoir à être explicitement créées dans l'arbre visuel.PropertyValueEditor et DependencyObject dans Blend 3 - Prise en charge de Silverlight DesignTime

Ces DependencyObjects a toutes ses propriétés DependencyProperties ainsi, pour soutenir DataBinding. Ils sont comme mentionné ci-dessus possible d'utiliser dans Storyboards.

En même temps, je développe le soutien de designtime spécial pour Blend 3 pour ces propriétés et ont créé un InlineEditorTemplate sous la forme d'un contrôle. Je crée le modèle et mettez-le PropertyValueEditor comme ceci:

 var vectorEditControl = new FrameworkElementFactory(typeof (VectorEditorControl)); 
     var dataTemplate = new DataTemplate {VisualTree = vectorEditControl}; 
     InlineEditorTemplate = dataTemplate; 

Dans le contrôle, je donne les résultats suivants:

<Grid DataContext="{Binding Value}">

<StackPanel Orientation="Horizontal"> 
    <TextBox Text="{Binding Path=X, Mode=TwoWay}"/> 
    <TextBox Text="{Binding Path=Y, Mode=TwoWay}"/> 
    <TextBox Text="{Binding Path=Z, Mode=TwoWay}"/> 
</StackPanel> 

</Grid>

L'éditeur montre et Je peux éditer les données. Et même pendant le débogage, je vois qu'il rétablit réellement les données à DependencyProperties sur les DependencyObjects, mais rien n'arrive au Xaml. Donc les données ne sont en fait pas persistantes dans le Xaml et perdues quand je ferme le fichier Xaml et l'ouvre à nouveau.

Y a-t-il quelque chose que je dois faire spécifiquement pour que je puisse entrer dans le Xaml? J'avais l'impression que cela arriverait automatiquement?

Répondre

1

Excellente question!

Le problème principal auquel vous êtes en cours d'exécution dans un malentendu quant à ce PropertyEditors en fin mélange/cidre jusqu'à databinding à.

Tenir compte de ce graphique d'objet:
- MyControl
- MyControl.MyProperty
--- FooClass
---- FooClass.BarProperty

Regardons un scénario où nous avons un PropertyEditor (de tout type: Inline, Dialog ou Extended) à la propriété MyControl.MyProperty. Lorsque vous vous trouvez dans MyPropertyPropertyEditor, vous vous attendez à obtenir une copie entièrement configurable de FooClass et à pouvoir manipuler ses membres. C'est une bonne hypothèse, mais la mauvaise.

La question de base est que Blend/cidre ont des structures de données élaborées qui représentent votre modèle au moment de la conception. Il y a environ 3 à 5 niveaux d'abstraction dans la façon dont Blend/Cider interagissent avec un contrôle réel. La création de ces niveaux d'abstraction permet aux concepteurs d'Expression Blend/Visual Studio de tirer parti des cadres (Silverlight/WPF) et de prendre en charge des scénarios avancés (tels que les transactions de propriété et le chaînage de propriétés). Par conséquent, la valeur que vous obtenez réellement dans DataBind correspond à l'un de ces niveaux d'abstraction.
Ne me croyez pas? Dans votre PropertyEditor personnalisé, inscrivez-vous à l'événement this.DataContextChanged et collez le type dans this.DataContext.Vous finirez par obtenir la classe PropertyValue (ou l'un de ses amis). Chaque modification de propriété que vous souhaitez conserver en mode XAML (et affichée sur la surface de conception) doit passer par ces couches d'abstraction. La question que vous devez vous poser est: "Où puis-je obtenir une de ces classes d'absteaction pour mon instance de propriété PropertyValue.Value?". Eh bien, ce que je ferais si j'étais vous créer un ModelItem autour de MyControl.MyProperty et le définir comme votre PropertyEditor.DataContext. Nous avons livré un exemple d'utilisation ModelFactory.CreateItem dans la boîte à outils Silverlight dans le cadre du graphique DefaultInitializer: Source Code, Ning Zhang (Awesome Design Time Dev) explains about ModelItem

Si vous avez des questions de suivi que je considère pinger PeteBl ou UnniR par Silverlight Liste de diffusion Insiders.

Sincèrement,
- Justin

+0

Merci c'est excellent. Maintenant, je n'ai pas besoin de me cogner la tête contre le mur ce soir. –

0

Il permet de résoudre en partie mon problème. J'ai un dialogue avec UnniR pour un suivi. Je ne voyais pas comment je pourrais utiliser ceci avec PropertyValueEditor, mais pour les valeurs par défaut c'est génial et quelque chose que je vais implémenter dès que possible.

Merci.