2017-07-19 7 views
0

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.

+0

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

Répondre

0

Eh bien, il a fallu un peu de travail pour faire avancer les choses, mais voici ce que je mis en œuvre:

Dans l'objet de données, je INotifyPropertyChanged et mis en œuvre lorsque le champ prioritaire est changé, je préviens les auditeurs du changement.

Dans le modèle de vue: J'ai implémenté la logique pour définir l'écouteur pour l'événement PropertyChanged et si la valeur existe déjà dans la liste des régions, j'ai défini un booléen dans l'objet indiquant qu'il est dans un état dupliqué.

Enfin dans l'objet de données j'ai implémenté l'interface IDataErrorInfo et si le propertyName est Priority et le Boolean est vrai, alors je renvoie mon erreur personnalisée.

A travaillé la première fois une fois que tous les tuyaux étaient en place! Où voulez-vous accéder au DataContext?