Datagrid Background Binding und Datatemplates

  • WPF

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von eichseinet.

    Datagrid Background Binding und Datatemplates

    Hallo zusammen!

    Ich schon wieder. In den letzten Tagen wurde mein Testprojekt um ein paar Funktionen erweitert. Nun ist der Hintergrund des Datagrid und die Formatierung der Zellen dran. Da steh ich leider wieder aufm Schlauch.
    Um an die einzelnen Spalten zu gelangen, sind diese nun im XAML angelegt. Das DataGrid ist nach wie vor an mein ICollectionView gebunden, das aus einer ObservableCollection gespeist ist. Der Textblock der Spalten ist an das jeweilige Property gebunden. und dann wollte ich den Background an eine neue Klasse binden, die gleich groß ist wie die ObervableCollection. So stünde für jede Zelle ein Wert für die Hintergrundfarbe bereit. Aber wie kann man sich dort an eine andere Klasse binden, als die fürs DataGrid?

    1. Gehe ich mit der Deklaration der Spalten im XAML bei meinem Projekt überhaupt den richtigen Weg, oder geht's auch einfacher?
    2. Wie bindet man jetzt eine 2. Klasse an den Background, oder sollte man die Farbwerte in die Datenklasse mit einbinden?
    3. Wenn im nächsten Schritt dann Datatemplates für einzelne Spalten dazu kommen, muss ich dann die Spalten im XAML deklarieren?

    Klasse Hintergrund

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel 'nötig für INotifyPropertyChanged
    2. Imports System.Runtime.CompilerServices
    3. Public Class Hintergrund
    4. Implements INotifyPropertyChanged 'benachrichtigt die Oberfläche (View) bei Änderung eines Propertys (Datendings)
    5. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 'wird automatisch bei der Implementierung des INotifyPropertyChanged eingefügt
    6. Private Sub raisepropertychanged(<CallerMemberName> Optional ByVal prop As String = "") 'wird bei Änderung in den Propertys aufgerufen
    7. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(prop))
    8. End Sub
    9. Public Sub New() 'nicht löschen! zum Speichern und Laden nötig
    10. End Sub
    11. Public Sub New(Farbe As Brush)
    12. End Sub
    13. Private _farbe As Brush
    14. Public Property Farbe As Brush
    15. Get
    16. Return _farbe
    17. End Get
    18. Set(value As Brush)
    19. _farbe = value
    20. raisepropertychanged()
    21. End Set
    22. End Property
    23. End Class


    Code behind

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private _hintergrundfarbe As ObservableCollection(Of Hintergrund)
    2. Public Property Hintergrundfarbe As ObservableCollection(Of Hintergrund)
    3. Get
    4. Return _hintergrundfarbe
    5. End Get
    6. Set(value As ObservableCollection(Of Hintergrund))
    7. _hintergrundfarbe = value
    8. raisepropertychanged()
    9. End Set
    10. End Property
    11. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    12. Hintergrundfarbe = New ObservableCollection(Of Hintergrund)
    13. Hintergrundfarbe.Add(New Hintergrund(Brushes.Red))
    14. Hintergrundfarbe.Add(New Hintergrund(Brushes.Red))
    15. Hintergrundfarbe.Add(New Hintergrund(Brushes.Red))
    16. Hintergrundfarbe.Add(New Hintergrund(Brushes.Red))
    17. Me.DataContext = Me
    18. End Sub


    XAML

    Spoiler anzeigen

    XML-Quellcode

    1. <Window x:Class="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. xmlns:local="clr-namespace:Databinding_mit_View02"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="600" Width="800">
    9. <Grid>
    10. <Grid.RowDefinitions>
    11. <RowDefinition/>
    12. <RowDefinition Height="120"/>
    13. </Grid.RowDefinitions>
    14. <DataGrid x:Name="Timer_DataGrid" ItemsSource="{Binding TimerView}" AutoGenerateColumns="False" CanUserSortColumns="True">
    15. <DataGrid.Columns>
    16. <DataGridTemplateColumn Header="EINS">
    17. <DataGridTemplateColumn.CellTemplate>
    18. <DataTemplate>
    19. <TextBlock Text="{Binding Startzeit}" Background="{x:Static Brushes.Red}"/>
    20. </DataTemplate>
    21. </DataGridTemplateColumn.CellTemplate>
    22. </DataGridTemplateColumn>
    23. <DataGridTemplateColumn Header="ZWEI">
    24. <DataGridTemplateColumn.CellTemplate>
    25. <DataTemplate>
    26. <TextBlock Text="{Binding Endzeit}" Background="{Binding Hintergrunfarbe}"/>
    27. </DataTemplate>
    28. </DataGridTemplateColumn.CellTemplate>
    29. </DataGridTemplateColumn>
    30. <DataGridTemplateColumn Header="DREI">
    31. <DataGridTemplateColumn.CellTemplate>
    32. <DataTemplate>
    33. <TextBlock Text="{Binding Dateiname}" />
    34. </DataTemplate>
    35. </DataGridTemplateColumn.CellTemplate>
    36. </DataGridTemplateColumn>
    37. </DataGrid.Columns>
    38. </DataGrid>


    P.S. leider sind die Spalten jetzt nicht mehr durch Klicken auf den Header sortierbar. Auch editieren lassen sie sich nicht mehr...

    Gruß

    eddi
    Inzwischen hab ich noch ein paar Minuten in das Projekt investiert (also am WE nix anders gemacht). Ich bekomme das Datagrid einfach nicht in den Griff. Zwar konnte ich auf den DataGrid.Cellstyle binden, aber nur auf die Daten im "Timer_View", das auf die Itemssource des Datagrids gebunden ist. Außerdem hab ich gemerkt, dass der Background des Textblocks eh die falsche Stelle wäre. Es soll ja die ganze Zelle rot werden.
    Der Versuch einen Style zu erstellen scheitert daran ihn an eine Spalte zu übergeben. Mir ist nicht klar, wo man den Key für einen Style an eine Spalte übergeben kann.

    XML-Quellcode

    1. <DataGrid.Resources>
    2. <Style x:Key="Timer_Style" TargetType="{x:Type DataGridCell}">
    3. <Setter Property="Background" Value="{Binding Hintergrund1}"/>
    4. <Setter Property="TextBlock.Text" Value="StringFormat= {}HH:mm dd.MM.yyyy}"/>
    5. </Style>
    6. </DataGrid.Resources>


    Auch konnte ich das Problem des Schreibschutzes nicht lösen. Readonly = false bringt mir nichts. Da muss etwas anders falsch sein. Auch der Versuch das Binding als Twoway vorzugeben schlug fehl (konnte nicht herausfinden, wie man das hier vorgibt) Zu erwähnen wäre noch, dass die automatisch erstellten Spalten weiter alle Funktionen bieten, wenn sie zusätzlich zu den selbst erstellten aus XAML angezeigt werden. (AutoGenerateColumns="true", dann erscheinen beide Versionen im DataGrid)

    Nachtrag: Ich sehe diesen Beitrag als erledigt an, weil für diesen Teil des Programms kein DataGrid mehr verwendet wird. Es macht mir nur Probleme.

    Gruß
    eddi

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