Ich stell mich ma wieder zu blöd an
ich hab ein Datacontext mit einer Tabelle "Anreden". Da die natürlich unique sein sollen, sind die auch gleich als Primärschlüsselspalte angelegt. Ich habe dann die Tabelle an ein Datagrid gebunden.
Bei Eingabe identischer anreden und dem Versuch das zu speichern, knallt es richtigerweise beim context.SubmitChanges(). Nun ist es natürlich viel schöner, wenn der Tastendrücker am Verlassen des Datagrid gehindert würde, wenn er sowas versucht einzugeben. Also hab ich mittels ValidatesOnExceptions=True die Validierung aktiviert und eine Klasse ValidationRule dafür gedichtet. Es wird dabei die Tabelle durchlaufen und nach identischen Einträgen durchsucht. Das funktioniert soweit für die Einträge, die bereits gespeichert wurden. Trage ich aber ohne zwischenzeitliches Speichern mehrmals das Gleiche ein, wird zwar die Rule ausgeführt, aber diese Einträge stehen natürlich noch nicht in der Tabelle.
Davon abgesehen halte ich es für doof, in der Visualisierung doch wieder an den Daten rumzudocktern.
Der Versuch, eine eigene Exception im datacontext beim "AnredenChanging" auszulösen geht zwar, löst aber keine Validierung im Datagrid aus. Da wirds dann wieder sone doofe Messagebox.
Es liefe also darauf hinaus, sich die CollectionView in der Rule-Klasse zu besorgen um deren Liste zu durchlaufen!? Oder was gibs da noch für eine Möglichkeit, das öleganter zu lösen?
Hier mal die Codes in VB:
Spoiler anzeigen
und XAML:
Spoiler anzeigen
Ich hab da bestimmt nen grobben Denkfehler drin.
OT Eigentlich schade, dass es kein separates WPF-Forum gibs, weil is intressante Sache, das /OT
Fielen Dank
Vatter
ich hab ein Datacontext mit einer Tabelle "Anreden". Da die natürlich unique sein sollen, sind die auch gleich als Primärschlüsselspalte angelegt. Ich habe dann die Tabelle an ein Datagrid gebunden.
Bei Eingabe identischer anreden und dem Versuch das zu speichern, knallt es richtigerweise beim context.SubmitChanges(). Nun ist es natürlich viel schöner, wenn der Tastendrücker am Verlassen des Datagrid gehindert würde, wenn er sowas versucht einzugeben. Also hab ich mittels ValidatesOnExceptions=True die Validierung aktiviert und eine Klasse ValidationRule dafür gedichtet. Es wird dabei die Tabelle durchlaufen und nach identischen Einträgen durchsucht. Das funktioniert soweit für die Einträge, die bereits gespeichert wurden. Trage ich aber ohne zwischenzeitliches Speichern mehrmals das Gleiche ein, wird zwar die Rule ausgeführt, aber diese Einträge stehen natürlich noch nicht in der Tabelle.
Davon abgesehen halte ich es für doof, in der Visualisierung doch wieder an den Daten rumzudocktern.
Der Versuch, eine eigene Exception im datacontext beim "AnredenChanging" auszulösen geht zwar, löst aber keine Validierung im Datagrid aus. Da wirds dann wieder sone doofe Messagebox.
Es liefe also darauf hinaus, sich die CollectionView in der Rule-Klasse zu besorgen um deren Liste zu durchlaufen!? Oder was gibs da noch für eine Möglichkeit, das öleganter zu lösen?
Hier mal die Codes in VB:
VB.NET-Quellcode
- Public Class UniqueValidation
- Inherits ValidationRule
- Private _myData As MainModel 'Die Klasse, wo die Daten gehalten werden
- Public Overrides Function Validate(value As Object, cultureInfo As System.Globalization.CultureInfo) As System.Windows.Controls.ValidationResult
- _myData = CType(My.Application.FindResource("Root"), MainModel)
- Dim _row As Anreden = _
- CType(CType(value, BindingGroup).Items(0), Anreden)
- For Each temp As Anreden In _myData.context.Anreden
- If temp.Anrede = _row.Anrede Then
- Return New ValidationResult(False, "Den Wert existiert bereits")
- End If
- Next
- Return ValidationResult.ValidResult
- End Function
- End Class
und 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"
- Height="350" Width="525"
- Title="MainWindow" DataContext="{Binding Source={StaticResource Root}}"
- xmlns:local="clr-namespace:DemoWPF" >
- <Window.Resources>
- <CollectionViewSource x:Key="Personenview" Source="{Binding Path=context.Personen}" />
- <CollectionViewSource x:Key="AnredenView" Source="{Binding Path=context.Anreden}" />
- </Window.Resources>
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition/>
- </Grid.RowDefinitions>
- <Grid.ColumnDefinitions>
- <ColumnDefinition/>
- <ColumnDefinition/>
- </Grid.ColumnDefinitions>
- <Button Grid.Column="0"
- Grid.Row="0"
- Command="{Binding Path=Laden}">Laden</Button>
- <Button Grid.Column="1"
- Grid.Row="0"
- Command="{Binding Path=Speichern}">Speichern</Button>
- <DataGrid Name="DG_Anreden"
- Grid.Column="0"
- Grid.Row="1"
- AutoGenerateColumns="false"
- IsSynchronizedWithCurrentItem="True"
- ItemsSource="{Binding Source={StaticResource AnredenView}}" >
- <DataGrid.RowValidationRules>
- <local:UniqueValidation ValidationStep="UpdatedValue" />
- </DataGrid.RowValidationRules>
- <DataGrid.Columns>
- <DataGridTextColumn Header="Anrede" Binding="{Binding Path=Anrede, ValidatesOnExceptions=True}" Width="0,5*"/>
- </DataGrid.Columns>
- </DataGrid>
- </Grid>
- </Window>
Ich hab da bestimmt nen grobben Denkfehler drin.
OT Eigentlich schade, dass es kein separates WPF-Forum gibs, weil is intressante Sache, das /OT
Fielen Dank
Vatter
Seit 26.Mai 2012 Oppa!