2011-03-29 2 views
2


Nous formons le texte pour un TextBlock en ajoutant une série d'objets System.Windows.Documents.Run à TextBlock.Inlines.Sl 4, MVVM: Utilisation des Inlines dans un TextBlock, comment lier à ViewModel?

Comment pouvons-nous lier le texte formaté dans le ViewModel à afficher dans le TextBlock?

Merci pour tout conseil ...

+0

En votre ViewModel quelle syntaxe est utilisée pour le "texte formaté"? – AnthonyWJones

+0

Je suis en train de convertir la machine virtuelle en une application existante, donc elle n'est pas encore définie dans la machine virtuelle. Actuellement, nous construisons une série d'objets Run et les ajoutons au TextBlock: TextBlock.Inlines.Add (run). – Number8

+0

Si vous "créez actuellement une série d'objets Run", cela signifie que certaines données existantes sont formatées. Quelle forme de balisage utilisez-vous actuellement lorsque vous stockez ce texte? HTML, RTF, SGML ou autre chose? – AnthonyWJones

Répondre

0

Je TENTATIVE la création d'une propriété InlineCollection dans aViewModel, puis définissez la liaison dans le XAML, mais le InlineCollection dans TextBlock n'est pas bindable, puisqu'il n'est pas un DependencyProperty. La réponse to this question montre créer votre propre contrôle et en faire un DependencyProperty qui est une bonne solution de contournement.

VM:

private InlineCollection inlineCollection; 

public InlineCollection TextBlockInlineCollection { 
    get 
    { 
     return inlineCollection; 
    } 
    set 
    { 
     inlineCollection = value; 
     NotifyPropertyChanged("TextBlockInlineCollection"); 
    } 
} 

XAML: // ne fonctionne pas

Vous pouvez également créer TextBlock dynamiquement dans le code en utilisant la XamlReader: exemple:

string textBlock = @"<TextBlock xmlns='http://schemas.microsoft.com/client/2007' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' x:Name='infoBarTextBlockWithFormatting' AutomationProperties.AutomationId='infoBarTextBlockWithFormatting' Margin='9,0,0,0' TextWrapping='Wrap'>"; 
    textBlock = String.Concat(textBlock, e.NewValue.ToString(), "</TextBlock>"); 
    infoBar.infoBarRunHolder.Child = (TextBlock)XamlReader.Load(textBlock); 
Questions connexes