Eine Textbox zum wrappen bringen (DataGrid.RowDetailsTemplate)

  • WPF

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Eine Textbox zum wrappen bringen (DataGrid.RowDetailsTemplate)

    Hallo Community,
    ich versuche jetzt schon eine geraume Zeit ein Layout in WPF zusammen zu bringen...
    Eine TextBox soll in einem DataGrid-Detailbereich angeordnet, seinen Textinhalt wrappen, wenn der Platz beim Zoomen zu wenig wird. (siehe Bilder)



    das funktioniert nur, wenn die Width-Property fix vorgegeben ist, aber die TextBox sich beim Zoomen dann nicht automatisch anpasst :whistling:



    sonst wird der Text einfach abgeschnitten... :whistling:

    XAML

    XML-Quellcode

    1. <Grid >
    2. <Grid.ColumnDefinitions>
    3. <ColumnDefinition Width="*" />
    4. </Grid.ColumnDefinitions>
    5. <Grid.RowDefinitions>
    6. <RowDefinition Height="Auto" />
    7. <RowDefinition Height="*" />
    8. </Grid.RowDefinitions>
    9. <Label Grid.Row="0" Background="AliceBlue" FontSize="22" Content="Mein Titel" HorizontalContentAlignment="Center" Margin="1" />
    10. <DataGrid Grid.Row="1" RowHeaderWidth="20" ItemsSource="{Binding Path=Context.Bestellungs}" RowDetailsVisibilityMode="Visible">
    11. <DataGrid.Columns>
    12. <DataGridTemplateColumn Header="Kunde" Width="*" IsReadOnly="True">
    13. <DataGridTemplateColumn.CellTemplate>
    14. <DataTemplate>
    15. <TextBox Text="Musterhaus" IsEnabled="False" HorizontalContentAlignment="Left" Background="LightGray" FontWeight="Bold"/>
    16. </DataTemplate>
    17. </DataGridTemplateColumn.CellTemplate>
    18. </DataGridTemplateColumn>
    19. <DataGridTemplateColumn Header="Mitarbeiter" Width="*" IsReadOnly="True">
    20. <DataGridTemplateColumn.CellTemplate>
    21. <DataTemplate>
    22. <TextBox Text="Max Mustermann" IsEnabled="False" HorizontalContentAlignment="Left" Background="LightGray" FontWeight="Bold"/>
    23. </DataTemplate>
    24. </DataGridTemplateColumn.CellTemplate>
    25. </DataGridTemplateColumn>
    26. </DataGrid.Columns>
    27. <DataGrid.RowDetailsTemplate>
    28. <DataTemplate>
    29. <Border BorderBrush="Red" BorderThickness="3" Width="250">
    30. <TextBox Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap"/>
    31. </Border>
    32. </DataTemplate>
    33. </DataGrid.RowDetailsTemplate>
    34. </DataGrid>
    35. </Grid>


    Was kann man da jetzt tun?
    Hat hierzu jemand eine Idee?

    Lg VB1963
    Jetzt habe ich da etwas im I-Net gefunden...
    stackoverflow.com/questions/42…-rowdetails-width-problem (letzte Beitrag von Ahmad)
    Da wird die Breite des Borders an die ActualWidth-Eigenschaft des ItemsPresenter gebunden...

    Diese Zeilen muss ich ausprobieren, wenn ich mein Studio wieder zur Hand habe.

    XML-Quellcode

    1. <DataGrid.RowDetailsTemplate>
    2. <DataTemplate>
    3. <Border BorderThickness="2,2,8,2"
    4. Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsPresenter}}, Path=ActualWidth}"
    5. HorizontalAlignment="Left" >
    6. <!-- add the row details view contents here -->
    7. </Border>
    8. </DataTemplate>
    9. </DataGrid.RowDetailsTemplate>

    ErfinderDesRades schrieb:

    Hmm - sieht aus wie Bug.

    Ich konnte im I-Net nichts dazu finden, dass es sich dabei um einen Bug handelt - aber obiger Lösungsansatz ist mir aufgefallen...

    Dazu gibt es sogar mehrere Vorschläge, die funktionieren:

    1) Wenn man die horizontale Scrollbar nicht benötigt, dann deaktiviert man sie einfach im DataGrid ScrollViewer.HorizontalScrollBarVisibility="Disabled"

    2) Oder man bindet die With-Property des Borders an die des ItemsPresenter
    XAML

    XML-Quellcode

    1. <DataGrid.RowDetailsTemplate>
    2. <DataTemplate>
    3. <Border BorderBrush="Red" BorderThickness="3,3,23,3" Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsPresenter}}, Path=ActualWidth}">
    4. <TextBox Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap"/>
    5. </Border>
    6. </DataTemplate>
    7. </DataGrid.RowDetailsTemplate>
    Man muss dabei nur beachten, dass die RowHeaderWidth="20" des DataGrid in der BorderThickness mitberücksichtigt

    3) Oder macht das Binding direkt in der TextBox ohne des Borders, wenn man will
    XAML

    XML-Quellcode

    1. <DataGrid.RowDetailsTemplate>
    2. <DataTemplate>
    3. <TextBox Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap"
    4. Padding="2,2,23,2" Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsPresenter}}, Path=ActualWidth}"/>
    5. </DataTemplate>
    6. </DataGrid.RowDetailsTemplate>
    und berücksichtigt die RowHeaderWidth="20" des DataGrid im Padding der TextBox

    4) Es gibt auch die Möglichkeit mit einem Converter zu arbeiten, wo man die RowHeaderWidth="20" über einen ConverterParameter berücksichtigt
    XAML

    XML-Quellcode

    1. <DataGrid.Resources>
    2. <my:DetailRowWidthConverter x:Key="myWidthConverter"/>
    3. </DataGrid.Resources>
    4. <DataGrid.RowDetailsTemplate>
    5. <DataTemplate>
    6. <TextBox Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap"
    7. Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsPresenter}}, Path=ActualWidth, Converter={StaticResource myWidthConverter}, ConverterParameter=20}""/>
    8. </DataTemplate>
    9. </DataGrid.RowDetailsTemplate>
    DetailRowWidthConverter

    VB.NET-Quellcode

    1. Public Class DetailRowWidthConverter
    2. Implements IValueConverter
    3. Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
    4. Dim p As Double
    5. Double.TryParse(CStr(parameter), p)
    6. Return CDbl(value) - CDbl(p)
    7. End Function
    8. Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
    9. Throw New NotImplementedException()
    10. End Function
    11. End Class
    Meiner Meinung nach führt das aber schon etwas zu weit...



    Sollte es noch weitere Möglichkeiten geben, dann würde mich dass sehr interessieren... :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()