J'ai examiné ce problème depuis presque 3 jours maintenant. Les recherches n'ont encore rien révélé. Les questions semblent répondre à ma question mais finissent par être totalement différentes. Alors voilà:Validation dans une grille de données accédant au modèle View?
J'ai une vue qui est liée à un modèle de vue. Dans la vue, j'ai un DataGrid qui est rempli par une liste dans le modèle de vue. Notre standard est de faire en sorte que la validation des erreurs de données se produise lorsque le champ sera surligné en rouge et que l'info-bulle contient le message d'erreur. De ce que j'ai lu pour faire cela dans un DataGrid j'ai besoin d'effectuer la validation dans la définition de classe au niveau de la propriété.
La validation cherche à voir si la valeur entrée est déjà présente dans la liste des éléments dans le DataGrid qui aide dans le modèle View. Je ne peux pas comprendre comment obtenir l'adressabilité au modèle de vue à partir de ma définition de classe.
Mes ressources définitions du dictionnaire:
<Style x:Key="DataGridTextBlockStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
<Setter Property="ToolTipService.ShowDuration"
Value="20000"/>
</Trigger>
</Style.Triggers>
Ma définition DataGrid:
<wpftk:DataGrid x:Name="SegmentGrid"
IsEnabled="True"
AutoGenerateColumns="False"
VerticalScrollBarVisibility="Auto"
Height="90"
ItemsSource="{Binding SegmentList}"
CanUserAddRows="False" CanUserDeleteRows="False" >
<event:EventCommandBehavior.EventCommands>
<event:EventCommand
RoutedEvent="wpftk:DataGrid.SelectionChanged"
Command="{Binding RegionSelectionChanged}"/>
</event:EventCommandBehavior.EventCommands>
<wpftk:DataGrid.Columns>
<wpftk:DataGridTextColumn Header="Name"
Width="265"
Binding="{Binding RegionName}" />
<!-- The Priority Column -->
<wpftk:DataGridTemplateColumn Header="Priority" Width="80">
<wpftk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Style="{StaticResource DataGridTextBlockStyle}"
Text="{Binding Priority, Mode=TwoWay,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</wpftk:DataGridTemplateColumn.CellTemplate>
<wpftk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox>
<TextBox.Text>
<Binding Path="Priority"
UpdateSourceTrigger="PropertyChanged"
ValidatesOnDataErrors="True"
ValidatesOnExceptions="True">
</Binding>
</TextBox.Text>
<TextBox.Style>
<Style TargetType="TextBox" BasedOn="{StaticResource CellEditStyle}" />
</TextBox.Style>
</TextBox>
</DataTemplate>
</wpftk:DataGridTemplateColumn.CellEditingTemplate>
</wpftk:DataGridTemplateColumn>
<wpftk:DataGridCheckBoxColumn Header="Write To Cartridge"
Binding="{Binding WriteToCartridge, Mode=TwoWay}"/>
</wpftk:DataGrid.Columns>
</wpftk:DataGrid>
</StackPanel>
Le champ prioritaire est le seul à être validé, mais je vais avoir un bougre d'un temps à faire valider. Tout ce que j'ai trouvé (faire la validation dans le seteur de priorités, faire la validation dans une classe de validateur personnalisé) fait tous une validation autonome qui n'a pas accès à l'objet DataContext.
Est-ce que quelqu'un connaît un moyen d'accéder au DataContext ou de pointer vers une méthode de ma classe pour faire la validation à l'intérieur? J'ai essayé d'hériter de l'interface IDataErrorInfo dans ma classe DataContext mais cela n'a jamais été appelé par la cellule DataGrid.
Votre classe avec la propriété Priority doit implémenter l'interface IDataErrorInfo.Veuillez lire ceci et modifier votre question en conséquence: https://stackoverflow.com/help/mcve – mm8