none
"ItemSource" im RichTextBlock RRS feed

  • Frage

  • Guten Abend,

    ich möchte eine variable Anzahl an kurzen Texten in einem RichTextBlock darstellen. Die Texte sollen in einem IEnumerable, beispielsweise einem string[], im ViewModel sein und ich möchte jeden Text in einem extra Paragraphen anzeigen lassen. Gibt es eine Möglichkeit, etwas wie ItemSource für den RichTextBlock festzulegen oder eine andere Lösung für mein Problem?

    Beste Grüße

    Samstag, 9. Juli 2016 18:24

Antworten

  • Hi,
    nachfolgend habe ich eine kleine Demo in VB.NET dargestellt. Da das RichTextBlock-Steuerelement keine bindbare Eigenschaft für anzuzeigenden Text hat, muss die Blocks-Auflistung direkt beschreiben werden. In MVVM kann man das mit einer DependencyProperty realisieren, mit derer Hilfe der ViewModel den Verweis auf die RichTextBlock-Instanz fängt.

    XAML:

    <Page
        x:Class="App1.Page03"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
      <Page.Resources>
        <local:Page03VM x:Key="vm"/>
      </Page.Resources>
      <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
            DataContext="{Binding Source={StaticResource vm}}">
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto"/>
          <RowDefinition/>
        </Grid.RowDefinitions>
        <Button Content="Text laden und Anzeigen" Command="{Binding Cmd}" />
        <RichTextBlock Grid.Row="1" DataContext="{Binding Source={StaticResource vm}}" local:Page03VM.Prop3a="True" />
      </Grid>
    </Page>

    Dazu der ViewModel:

    Imports Windows.UI.Xaml.Documents Public Class Page03VM Public Shared ReadOnly Prop3aProperty As DependencyProperty = DependencyProperty.RegisterAttached("Prop3a", GetType(Boolean), GetType(RichTextBlock), New PropertyMetadata(False, AddressOf OnProp3a)) Public Shared Function GetProp3a(ByVal obj As DependencyObject) As Boolean Return CType(obj.GetValue(Prop3aProperty), Boolean) End Function Public Shared Sub SetProp3a(ByVal obj As DependencyObject, ByVal value As Boolean) obj.SetValue(Prop3aProperty, value) End Sub Private Shared Sub OnProp3a(ByVal depObj As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) Dim tb = TryCast(depObj, RichTextBlock) If tb Is Nothing OrElse e.NewValue.GetType IsNot GetType(Boolean) Then Exit Sub CType(tb.DataContext, Page03VM).tbVerweis = If(CType(e.NewValue, Boolean), tb, Nothing) End Sub Private Property tbVerweis As RichTextBlock Public ReadOnly Property Cmd As ICommand Get Return New RelayCommand(AddressOf CmdExec) End Get End Property Private Sub CmdExec(obj As Object) For Each item In GetData() Dim p As New Paragraph p.Inlines.Add(New Run With {.Text = item}) tbVerweis.Blocks.Add(p) Next End Sub Friend Function GetData() As String() Dim l As New List(Of String) For i = 1 To 10 l.Add($"Zeile {i}") Next Return l.ToArray End Function

    End Class




    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen! Leben retten!
    Wir essen Opa.
    Wir essen, Opa.





    • Bearbeitet Peter Fleischer Sonntag, 10. Juli 2016 07:46
    • Als Antwort markiert Flogex Sonntag, 10. Juli 2016 08:45
    Sonntag, 10. Juli 2016 07:38

Alle Antworten

  • Hi,
    nachfolgend habe ich eine kleine Demo in VB.NET dargestellt. Da das RichTextBlock-Steuerelement keine bindbare Eigenschaft für anzuzeigenden Text hat, muss die Blocks-Auflistung direkt beschreiben werden. In MVVM kann man das mit einer DependencyProperty realisieren, mit derer Hilfe der ViewModel den Verweis auf die RichTextBlock-Instanz fängt.

    XAML:

    <Page
        x:Class="App1.Page03"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
      <Page.Resources>
        <local:Page03VM x:Key="vm"/>
      </Page.Resources>
      <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
            DataContext="{Binding Source={StaticResource vm}}">
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto"/>
          <RowDefinition/>
        </Grid.RowDefinitions>
        <Button Content="Text laden und Anzeigen" Command="{Binding Cmd}" />
        <RichTextBlock Grid.Row="1" DataContext="{Binding Source={StaticResource vm}}" local:Page03VM.Prop3a="True" />
      </Grid>
    </Page>

    Dazu der ViewModel:

    Imports Windows.UI.Xaml.Documents Public Class Page03VM Public Shared ReadOnly Prop3aProperty As DependencyProperty = DependencyProperty.RegisterAttached("Prop3a", GetType(Boolean), GetType(RichTextBlock), New PropertyMetadata(False, AddressOf OnProp3a)) Public Shared Function GetProp3a(ByVal obj As DependencyObject) As Boolean Return CType(obj.GetValue(Prop3aProperty), Boolean) End Function Public Shared Sub SetProp3a(ByVal obj As DependencyObject, ByVal value As Boolean) obj.SetValue(Prop3aProperty, value) End Sub Private Shared Sub OnProp3a(ByVal depObj As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) Dim tb = TryCast(depObj, RichTextBlock) If tb Is Nothing OrElse e.NewValue.GetType IsNot GetType(Boolean) Then Exit Sub CType(tb.DataContext, Page03VM).tbVerweis = If(CType(e.NewValue, Boolean), tb, Nothing) End Sub Private Property tbVerweis As RichTextBlock Public ReadOnly Property Cmd As ICommand Get Return New RelayCommand(AddressOf CmdExec) End Get End Property Private Sub CmdExec(obj As Object) For Each item In GetData() Dim p As New Paragraph p.Inlines.Add(New Run With {.Text = item}) tbVerweis.Blocks.Add(p) Next End Sub Friend Function GetData() As String() Dim l As New List(Of String) For i = 1 To 10 l.Add($"Zeile {i}") Next Return l.ToArray End Function

    End Class




    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen! Leben retten!
    Wir essen Opa.
    Wir essen, Opa.





    • Bearbeitet Peter Fleischer Sonntag, 10. Juli 2016 07:46
    • Als Antwort markiert Flogex Sonntag, 10. Juli 2016 08:45
    Sonntag, 10. Juli 2016 07:38
  • Vielen Dank, damit kann ich etwas anfangen.

    Beste Grüße

    Sonntag, 10. Juli 2016 08:45