2011-12-01 6 views
3

J'ai simple IMarkupExtension comme suit:Silverlight5 MarkupExtension au moment du design

public class HelloWorldMarkup : IMarkupExtension<string> 
{ 
    public string ProvideValue(IServiceProvider serviceProvider) 
    { 
     return "Hello World"; 
    } 
    public override string ToString() 
    { 
     return "DesignTime Hello World"; 
    } 
} 

et mon Xaml qui l'utilise comme ça ..

<StackPanel> 
    <TextBlock Text="{my:HelloWorldMarkup}" /> 
    <HyperlinkButton Content="{my:HelloWorldMarkup}" /> 
</StackPanel> 

Lors de l'exécution, tout cela fonctionne comme prévu.

Au moment du design, cependant, le contenu du lien hypertexte affiche les valeurs de temps de conception (à partir de ToString), mais le texte du TextBlock ne s'affiche pas.

Si je le laisse comme ceci, mon concepteur me plaindra pendant des jours. Est-ce que n'importe qui a des suggestions sur comment je peux avoir mes données de conception d'affichage de Markups dans TextBlock Text?

Un grand merci,

Répondre

4

try ..

<TextBlock DataContext="{my:HelloWorldMarkup}" Text="{Binding}" /> 
+1

Cela fonctionne !! Je vous remercie. [J'ai appliqué une modification à votre réponse pour la mettre dans le même format/xaml que la question] – Sam

1

Vous êtes à mi-chemin sur la bonne voie. Il existe une solution de contournement à ce problème ("par conception"):

Utilisez l'interface IMarkupExtension et dérivez un certain contrôle avec une propriété de contenu (par exemple ContentControl). Maintenant, écoutez les modifications apportées à la propriété "Parent" (vous devrez peut-être utiliser une solution de contournement complexe en utilisant les propriétés jointes). Le rappel d'événement doit alors appeler ProvideValue seul en utilisant une implémentation IProvideValueTarget simple et personnalisée. Le résultat de ProvideValue doit ensuite être affecté à la propriété "Content". Cela n'affecte pas l'exécution car ProvideValue sera évalué avant le contrôle et fonctionne comme un charme au moment du design.

Je pense également à l'installation d'une liaison sur la propriété target, réduisant ainsi la classe de base à FrameworkElement. Pour un exemple de ce processus, référez-vous à https://github.com/MrCircuit/XAMLMarkupExtensions et https://github.com/MrCircuit/WPFLocalizationExtension.

Questions connexes