|  |  | 
					
						| Monday, December 10, 2007 |  
						| Databinding to a XAML FlowDocument Posted: 11:25:00 PM
 |  
						| I couldn't find a full example of this, I had to put bits and pieces together before I got this working. 
 Let's say you have a datasource, and in that datasource, one of the datamembers is a string that contains some FlowDocument XAML.  For example:
 
 
 
<Section xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Paragraph>This is a test.</Paragraph>
</Section> Unfortunately, there's no way to directly bind a string to a FlowDocument object.  However, XAML databinding allows the use of custom converters that allows you to take that string and convert it to whatever you like.  To do this, create a class:
 
 
 
Namespace Converters
 
    <ValueConversion(GetType(Object), GetType(FlowDocument))> Public Class FlowDocumentConverter
        Implements IValueConverter
 
        Public Function Convert(ByVal objValue As Object, ByVal tTarget As Type, ByVal objParam As Object, _
                    ByVal ciCulture As CultureInfo) As Object Implements IValueConverter.Convert
            Using msDocument As New MemoryStream((New ASCIIEncoding).GetBytes(CStr(objValue)))
                Dim fdDocument As New FlowDocument()
                Dim trDocument As New TextRange(fdDocument.ContentStart, fdDocument.ContentEnd)
                trDocument.Load(msDocument, DataFormats.Xaml)
                trDocument = Nothing
                Return fdDocument
            End Using
        End Function
 
        Public Function ConvertBack(ByVal objValue As Object, ByVal tTarget As Type, ByVal objParam As Object, _
                    ByVal ciCulture As CultureInfo) As Object Implements IValueConverter.ConvertBack
            Return Nothing 'Not interested in converting back from a FlowDocument to a String
        End Function
 
    End Class
 
End Namespace Now add your xmlns to the page/usercontrol/window/whatever...
 
 
 
<Page ... xmlns:converters="clr-namespace:Converters" ... > Create yourself some resources...
 
 
 
<Page.Resources>
    <converter:FlowDocumentConverter x:Key="FlowDocumentConverter" />
</Page.Resources> And bind like so...
 
 
 
<FlowDocumentScrollViewer Document="{Binding PropertyName, Converter={StaticResource FlowDocumentConverter}}" /> Just replace "PropertyName" with the name of the property or column that has the XAML FlowDocument string you wish to use.
 
 It's a little counter-intuitive, it would be nice if you could just Document="{Binding PropertyName}" and be done with it, converting it to a FlowDocument on the fly... but the solution here is easy enough.
 Labels: Coding, Databinding, FlowDocument, VB.NET, XAML 
 
 0 Comments
 
 
 |  |