Hallo!
Nachdem ich mein Lernprojekt jetzt fast fertig hatte, fiel mir vorhin ein ganz enormer Fehler auf. Werte, die manuell im DataGrid geändert werden, gelangen nicht in die Collection. Der neue Wert bleibt nur solange in der Zelle stehen, bis ich z.B. sortiere. Ändert sich ein Wert über den Code in der Collection, dann zeigt das Grid den neuen Wert an.
Die Daten liegen in einer ObservableCollection, die an eine ICollectionView gebunden ist. Diese wiederum ist dann an das DataGrid gebunden.
XAML:
Spoiler anzeigen
Code (auszugsweise):
Spoiler anzeigen
Klasse:
Spoiler anzeigen
Ich erkenne einfach nicht, was da falsch ist.
Gruß
eddi
Nachdem ich mein Lernprojekt jetzt fast fertig hatte, fiel mir vorhin ein ganz enormer Fehler auf. Werte, die manuell im DataGrid geändert werden, gelangen nicht in die Collection. Der neue Wert bleibt nur solange in der Zelle stehen, bis ich z.B. sortiere. Ändert sich ein Wert über den Code in der Collection, dann zeigt das Grid den neuen Wert an.
Die Daten liegen in einer ObservableCollection, die an eine ICollectionView gebunden ist. Diese wiederum ist dann an das DataGrid gebunden.
XAML:
XML-Quellcode
- <Window x:Class="MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:local="clr-namespace:Databinding_mit_View02"
- xmlns:Converter="clr-namespace:Databinding_mit_View02.Converter"
- mc:Ignorable="d"
- Title="MainWindow" Height="600" Width="800">
- <Grid>
- <TabControl>
- <TabItem x:Name="DataGrid2_Tab" Header="DataGrid2">
- <TabItem.Resources>
- <!--Vorlage fürs ganze DataGrid-->
- <Style x:Key="GridStyle_Key" TargetType="{x:Type DataGrid}">
- <Setter Property="ColumnHeaderStyle" Value="{DynamicResource SpaltenStyle_Key}"/>
- </Style>
- <!--Vorlage für die Spalten-->
- <Style x:Key="SpaltenStyle_Key" TargetType="DataGridColumnHeader">
- <Setter Property="Height" Value="30"/>
- <Setter Property="FontSize" Value="16"/>
- <Style.Triggers>
- <Trigger Property="IsMouseOver" Value="true">
- <Setter Property="ToolTip" Value="Sortierbar, weil im XAML der Spalte ein SortMemberPath zugewiesen ist"/>
- <Setter Property="ToolTipService.ShowDuration" Value="60000"/>
- </Trigger>
- </Style.Triggers>
- </Style>
- <Converter:TextinFarbeConverter x:Key="TextinFarbeConverter_Key"/>
- </TabItem.Resources>
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition/>
- <RowDefinition Height="120"/>
- </Grid.RowDefinitions>
- <DataGrid x:Name="Grid2" ItemsSource="{Binding Aufnahmen_View, Mode=TwoWay}" AutoGenerateColumns="False" Style="{DynamicResource GridStyle_Key}" SelectionUnit="CellOrRowHeader">
- <DataGrid.Columns>
- <DataGridTemplateColumn Header="löschen">
- <DataGridTemplateColumn.HeaderStyle>
- <Style TargetType="DataGridColumnHeader">
- <Setter Property="Height" Value="30"/>
- <Setter Property="FontSize" Value="16"/>
- <Style.Triggers>
- <Trigger Property="IsMouseOver" Value="true">
- <Setter Property="ToolTip" Value="Style direkt der Spalte zugewiesen"/>
- <Setter Property="ToolTipService.ShowDuration" Value="60000"/>
- </Trigger>
- </Style.Triggers>
- </Style>
- </DataGridTemplateColumn.HeaderStyle>
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <Button Content="löschen" CommandParameter="{Binding Path=ID}" Click="Button_Click_1" ToolTip="löscht diese Zeile aus der Collection, auch wenn sortiert wurde!" ToolTipService.ShowDuration="60000"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- <DataGridTemplateColumn Header="ID" SortMemberPath="ID" IsReadOnly="True">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <TextBox Text="{Binding ID}"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- <DataGridTemplateColumn Header="Ordner" SortMemberPath="Ordner" Width="200">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <TextBox Text="{Binding Ordner}" BorderThickness="0" Background="Aquamarine"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- <DataGridTemplateColumn Header="Dateiname" SortMemberPath="Dateiname">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <TextBox Text="{Binding Dateiname}"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- <DataGridTemplateColumn Header="Datum" SortMemberPath="Datum">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <TextBox Text="{Binding Datum, StringFormat={}dd.MM.yyyy}"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- <!--SortMemberPath muss auf das gleiche Property wie der Text eingestellt sein, um über den Spaltenkopf sortieren zu können-->
- <DataGridTemplateColumn Header="Größe" SortMemberPath="Groesse">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <!--durch ConverterCulture zeigt die Zelle ein Komma statt einen Punkt in den Zahlen, Stringformat sorgt dann nur immer für eine Nachkommastelle-->
- <TextBox Text="{Binding Groesse, Mode=TwoWay, ConverterCulture='de-DE', StringFormat=0.0}" TextAlignment="Right" Background="{Binding Path=Hintergrund_Groesse, Converter={StaticResource TextinFarbeConverter_Key}}"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- <DataGridTemplateColumn Header="Hintergrund Groesse">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <TextBox Text="{Binding Hintergrund_Groesse}"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- </DataGrid.Columns>
- </DataGrid>
Code (auszugsweise):
VB.NET-Quellcode
- Private _aufnahmen_coll As ObservableCollection(Of Aufnahmen)
- Public Property Aufnahmen_Coll() As ObservableCollection(Of Aufnahmen)
- Get
- Return _aufnahmen_coll
- End Get
- Set(ByVal value As ObservableCollection(Of Aufnahmen))
- _aufnahmen_coll = value
- raisepropertychanged()
- End Set
- End Property
- Private _aufnahmen_view As ICollectionView
- Public Property Aufnahmen_View() As ICollectionView
- Get
- Return _aufnahmen_view
- End Get
- Set(ByVal value As ICollectionView)
- _aufnahmen_view = value
- raisepropertychanged()
- End Set
- End Property
- Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
- Aufnahmen_Coll = New ObservableCollection(Of Aufnahmen)
- Aufnahmen_Coll.Add(New Aufnahmen("C:\temp0", "Dings.txt", "24.03.2019", "234,5", 0, "rot"))
- Aufnahmen_Coll.Add(New Aufnahmen("C:\temp3", "Uings.txt", "24.03.2019", "111", 1, ""))
- Aufnahmen_Coll.Add(New Aufnahmen("C:\temp1", "aings.txt", "24.03.2019", "334,7", 2, "rot"))
- Aufnahmen_Coll.Add(New Aufnahmen("C:\temp2", "Kings.txt", "24.03.2019", "96,6", 3, ""))
- Aufnahmen_View = CollectionViewSource.GetDefaultView(Aufnahmen_Coll)
- Aufnahmen_View.Filter = AddressOf Filterfunktion_DG2
- End Sub
- Me.DataContext = Me
Klasse:
VB.NET-Quellcode
- Imports System.ComponentModel
- Imports System.Runtime.CompilerServices
- Public Class Aufnahmen
- Implements INotifyPropertyChanged
- Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
- Private Sub raisepropertychanged(<CallerMemberName> Optional ByVal prop As String = "") 'wird bei Änderung in den Propertys aufgerufen
- RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(prop))
- End Sub
- Public Sub New() 'für Speicherfunktion nötig
- End Sub
- Public Sub New(ordner As String, dateiname As String, datum As Date, groesse As Single)
- Me.Ordner = ordner : Me.Dateiname = dateiname : Me.Datum = datum : Me.Groesse = groesse
- End Sub
- Public Sub New(ordner As String, dateiname As String, datum As Date, groesse As Single, id As Integer)
- Me.Ordner = ordner : Me.Dateiname = dateiname : Me.Datum = datum : Me.Groesse = groesse : Me.ID = id
- End Sub
- Public Sub New(ordner As String, dateiname As String, datum As Date, groesse As Single, id As Integer, hintergrund_groesse As String)
- Me.Ordner = ordner : Me.Dateiname = dateiname : Me.Datum = datum : Me.Groesse = groesse : Me.ID = id : Me.Hintergrund_Groesse = hintergrund_groesse
- End Sub
- Private _ordner As String
- Public Property Ordner() As String
- Get
- Return _ordner
- End Get
- Set(ByVal value As String)
- _ordner = value
- raisepropertychanged()
- End Set
- End Property
- Private _dateiname As String
- Public Property Dateiname() As String
- Get
- Return _dateiname
- End Get
- Set(ByVal value As String)
- _dateiname = value
- raisepropertychanged()
- End Set
- End Property
- Private _datum As Date
- Public Property Datum() As Date
- Get
- Return _datum
- End Get
- Set(ByVal value As Date)
- _datum = value
- raisepropertychanged()
- End Set
- End Property
- Private _groesse As Single
- Public Property Groesse() As Single
- Get
- Return _groesse
- End Get
- Set(ByVal value As Single)
- _groesse = value
- raisepropertychanged()
- End Set
- End Property
- Private _id As Integer
- Public Property ID() As Integer
- Get
- Return _id
- End Get
- Set(ByVal value As Integer)
- _id = value
- raisepropertychanged()
- End Set
- End Property
- Private _hintergrund_groesse As String
- Public Property Hintergrund_Groesse() As String
- Get
- Return _hintergrund_groesse
- End Get
- Set(ByVal value As String)
- _hintergrund_groesse = value
- raisepropertychanged()
- End Set
- End Property
- End Class
Ich erkenne einfach nicht, was da falsch ist.
Gruß
eddi