Columns eines DataGrid wiederholend spaltenweise in einem UserControl zusammenfassen

  • WPF

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Columns eines DataGrid wiederholend spaltenweise in einem UserControl zusammenfassen

    Hallo Community

    Wie geschieht die Bindung Control zu den Daten, wenn man in einem DataGrid Columns über ein UserControl spaltenweise gruppiert zusammenfasst,
    die sich einige male in spaltenrichtung wiederholen?
    Ich habe nach Wunsch von @Nofear23m in dieser Diskussion jetzt einen eigenen Themen-Thread dazu eröffnet...
    Anbei ein rudimentäres Sample (mit nur 2 Gruppen), wie ich das genau meine.
    Dort musste ich eine eigene Klasse mit Depenency-Properties für die Bindung anlegen.
    Aber ich glaube, dass es dafü eine bessere Methode dazu gibt!
    Kann mir jemand etwas dazu sagen?

    Lg
    VB1963
    Dateien

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

    Hallo

    Nur zum Verständniss.
    Es geht dir jetzt nicht darum dynamisch die wochentage hinzuzufügen sondern einfach um diese Zusammenfassung von WeekPlanVM richtig?

    Also darum das man WeekPlanVM in einer Zelle darstellt ohne DependencyProperties in einem Usercontrol verwenden zu müssen richtig??

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Hallo

    Ja, genau das Beispiel im anderen Thread demonstriert dies. Genau wie ich es dort gemacht habe geht das auch in deinem Fall. Zumindest wenn ich es richtig verstanden habe.

    Anbei eine Solution wo die Zusatzklasse fehlt.
    Der DataContext des Usercontrol wird einfach darauf gesetzt.

    Der "Ordnunghalber" habe ich jetzt noch die Properties Name und Cycle in eine Klasse zusammengefasst, müsste aber eigendlich auch nicht sein, aber Ordnung ist das halbe Leben, liest sich so auch besser finde ich.
    Sonst habe ich im Grunde nicht wirklich was unternommen.

    Anbei die Solution.


    Grüße
    Sascha
    Dateien
    • TestColumn.zip

      (63,28 kB, 11 mal heruntergeladen, zuletzt: )
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Hallo

    In dem Fall (unschön) definierst du das DataTemplate direkt in der DataGridcolumn und bindest auf die Properties.

    XML-Quellcode

    1. <DataTemplate>
    2. <Grid>
    3. <Grid.ColumnDefinitions>
    4. <ColumnDefinition Width="100"/>
    5. <ColumnDefinition Width="25"/>
    6. </Grid.ColumnDefinitions>
    7. <Border Background="LightGray" BorderBrush="White" BorderThickness="0.5">
    8. <TextBlock Text="{Binding Name1,FallbackValue=Error}" FontWeight="Bold" HorizontalAlignment="Center" Foreground="Black"/>
    9. </Border>
    10. <Border Grid.Column="1" Background="AntiqueWhite" BorderBrush="White" BorderThickness="0.5">
    11. <TextBlock Text="{Binding Cycle1,FallbackValue=Error}" HorizontalAlignment="Center" Foreground="Black"/>
    12. </Border>
    13. </Grid>
    14. </DataTemplate>


    Dann benöigt es weder das Usercontrol noch eine Zwischenklasse.
    Anbei eine Solution.

    Grüße
    Sascha
    Dateien
    • TestColumn.zip

      (56,31 kB, 11 mal heruntergeladen, zuletzt: )
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Hallo

    VB1963 schrieb:

    Dann hat diese Zwischenklasse in diesem Fall doch seine Berechtigung

    Wenn du deine meinst, jein. Ja, das funktioniert, ist aber mit Kanonen auf Spatzen geschossen. Dependency Properties müssen in diesem Fall ja gar nicht sein.
    Kann man machen und wenn man unbedingt von aussen über XAML setzen möchte auch legitim. Aber wie gezeigt gehts eben einfacher mit ganz normalen Properties wo man dann eben auch ganz schlicht un einfach mit dem Setter agieren kann usw.

    Dependency Properties sind ja wieder eine ganz eigene Sache.

    Im Grunde versuche ich selbst immer für jede Art von Objekt eine VM Klasse zu haben. Sauber und übersichtlich.

    Ich hoffe ich konnte damit deine Fragen beantworten. Wenn nicht, frag einfach nur.
    Schöne Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    mir gefällt das Viewmodel nicht, mit dene Name0, Name1, Cycle0, Cycle1 etc.
    Ich täte da ein klein Klasse bauen, die Name + Cycle zusammenfasst, und dann 7 davon (oder 5, wenn WE nicht gebraucht wird):

    VB.NET-Quellcode

    1. Namespace EdrViewModel
    2. Public Class WeekPlan : Inherits ViewModelBase
    3. Public Property Number() As Integer
    4. Public Property Workplace() As String
    5. Public Property CycleNames() As CycleName() = New CycleName(6) {}
    6. End Class
    7. Public Class CycleName
    8. Public Property Name As String = "n.a."
    9. Public Property Cycle As String = "n.a."
    10. End Class
    11. End Namespace




    MainViewmodel:

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Namespace EdrViewModel
    3. Public Class MainVM
    4. Public Shared Instance As New MainVM
    5. Public Property WeekPlans() As New ObservableCollection(Of WeekPlan)
    6. Public Sub New()
    7. Dim names = "Max Mustermann°Erika Musterfrau°Hello°World°Suzi Quatro°Nobody".Split("°"c)
    8. Dim cycles = "A3 M1 C3 N2 X3 H4".Split
    9. Dim itms = (From nam In names, ccl In cycles).ToArray
    10. itms.Shuffle(99)
    11. Dim items = itms.GetEnumeratorX
    12. Dim wpNames = "links hinten vorne".Split
    13. For i = 0 To wpNames.Length - 1
    14. Dim wp = New WeekPlan With {.Number = i + 1, .Workplace = wpNames(i)}
    15. wp.CycleNames = 7.Times(Function(ii)
    16. Dim itm = items.Yield
    17. Return New CycleName With {.Cycle = itm.ccl, .Name = itm.nam}
    18. End Function).ToArray
    19. WeekPlans.Add(wp)
    20. Next
    21. End Sub
    22. End Class
    23. End Namespace
    mal wieder das komplizierteste ist die Initialisierung mit Dummi-Daten



    Und UserControls bau ich lieber so, dass die für einen bestimmten DataContext vorgesehen sind - eigene DepProps und Zeug brauchts da nicht

    XML-Quellcode

    1. <UserControl x:Class="EdrView.uclCycleName"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. mc:Ignorable="d"
    7. xmlns:vm="clr-namespace:TestDataGridGroupColumn.EdrViewModel"
    8. xmlns:vw="clr-namespace:TestDataGridGroupColumn.EdrView"
    9. d:DataContext="{Binding Source={x:Static vm:MainVM.Instance}, Path=WeekPlans[0].CycleNames[0]}"
    10. d:DesignHeight="30" d:DesignWidth="300">
    11. <Grid>
    12. <Grid.ColumnDefinitions>
    13. <ColumnDefinition SharedSizeGroup="FirstCol" Width="3*"/>
    14. <ColumnDefinition SharedSizeGroup="SecondCol"/>
    15. </Grid.ColumnDefinitions>
    16. <Border Background="LightGray" BorderBrush="White" BorderThickness="0.5">
    17. <TextBlock FontWeight="Bold" HorizontalAlignment="Center" Foreground="Black" Text="{Binding Name}" VerticalAlignment="Center"/>
    18. </Border>
    19. <Border Grid.Column="1" Background="AntiqueWhite" BorderBrush="White" BorderThickness="0.5">
    20. <TextBlock HorizontalAlignment="Center" Foreground="Black" Text="{Binding Cycle}" VerticalAlignment="Center"/>
    21. </Border>
    22. </Grid>
    23. </UserControl>




    MainWindow

    XML-Quellcode

    1. <Window x:Class="EdrView.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. mc:Ignorable="d"
    7. xmlns:local="clr-namespace:TestDataGridGroupColumn"
    8. xmlns:vm="clr-namespace:TestDataGridGroupColumn.EdrViewModel"
    9. xmlns:vw="clr-namespace:TestDataGridGroupColumn.EdrView"
    10. DataContext="{Binding Source={x:Static vm:MainVM.Instance}}"
    11. Title="EdrMainWindow">
    12. <Grid>
    13. <DataGrid ItemsSource="{Binding WeekPlans}"
    14. IsSynchronizedWithCurrentItem="True"
    15. AutoGenerateColumns="False"
    16. HeadersVisibility="Column"
    17. SelectionMode="Single"
    18. SelectionUnit="CellOrRowHeader"
    19. CanUserAddRows="False"
    20. Grid.IsSharedSizeScope="True">
    21. <DataGrid.Columns>
    22. <DataGridTemplateColumn Header="Nr">
    23. <DataGridTemplateColumn.CellTemplate >
    24. <DataTemplate>
    25. <TextBlock Text="{Binding Number}" HorizontalAlignment="Center"/>
    26. </DataTemplate>
    27. </DataGridTemplateColumn.CellTemplate>
    28. </DataGridTemplateColumn>
    29. <DataGridTemplateColumn Header="Arbeitsplatz">
    30. <DataGridTemplateColumn.CellTemplate>
    31. <DataTemplate>
    32. <TextBlock Text="{Binding Workplace}" HorizontalAlignment="Center"/>
    33. </DataTemplate>
    34. </DataGridTemplateColumn.CellTemplate>
    35. </DataGridTemplateColumn>
    36. <DataGridTemplateColumn Header="Montag">
    37. <DataGridTemplateColumn.CellTemplate>
    38. <DataTemplate>
    39. <vw:uclCycleName DataContext="{Binding CycleNames[0]}"/>
    40. </DataTemplate>
    41. </DataGridTemplateColumn.CellTemplate>
    42. </DataGridTemplateColumn>
    43. <DataGridTemplateColumn Header="Dienstag">
    44. <DataGridTemplateColumn.CellTemplate>
    45. <DataTemplate>
    46. <vw:uclCycleName DataContext="{Binding CycleNames[1]}"/>
    47. </DataTemplate>
    48. </DataGridTemplateColumn.CellTemplate>
    49. </DataGridTemplateColumn>
    50. <DataGridTemplateColumn Header="Mittwoch">
    51. <DataGridTemplateColumn.CellTemplate>
    52. <DataTemplate>
    53. <vw:uclCycleName DataContext="{Binding CycleNames[2]}"/>
    54. </DataTemplate>
    55. </DataGridTemplateColumn.CellTemplate>
    56. </DataGridTemplateColumn>
    57. <DataGridTemplateColumn Header="Donnerstag">
    58. <DataGridTemplateColumn.CellTemplate>
    59. <DataTemplate>
    60. <vw:uclCycleName DataContext="{Binding CycleNames[3]}"/>
    61. </DataTemplate>
    62. </DataGridTemplateColumn.CellTemplate>
    63. </DataGridTemplateColumn>
    64. </DataGrid.Columns>
    65. </DataGrid>
    66. </Grid>
    67. </Window>
    Ist halt aufgeblasen wegen der bescheuerten Xaml-Syntax, wo man für jede DG-Column mindest. 7 Zeilen braucht - obwohls alles das gleiche ist.
    Dateien