Question

Si mes objets de domaine implémentent IDataErrorInfo et que j'utilise M-V-VM, comment puis-je propager des erreurs dans le ViewModel dans la vue? Si je me liai directement au modèle, je définirais le paramètre "ValidateOnExceptons". et " ValidateOnErrors " propriétés à true sur ma liaison. Mais mon ViewModel n'implémente pas IDataErrorInfo. Seulement mon modèle. Qu'est-ce que je fais?

Clarification Je traite avec une base de code existante qui implémente IDataErrorInfo dans les objets de domaine. Je ne peux pas simplement implémenter IDataErrorInfo dans le modèle de vue.

Était-ce utile?

La solution

Vous pouvez également implémenter IDataErrorInfo dans votre machine virtuelle et acheminer les appels de celle-ci vers les objets de domaine correspondants. Je pense que c'est le seul moyen de ne pas exposer directement les objets du domaine à la vue.

Autres conseils

si vous utilisez M-V-VM, le ViewModel doit définir l'interface IDataErrorInfo, pas le modèle.

On pourrait dire que l'interface IDataErrorInfo est juste pour la vue et qu'elle n'appartient pas au modèle, mais c'est une question de style.

Demander à ViewModel de mettre en œuvre l'interface IDataErrorInfo et de propager les erreurs du modèle serait la réponse la plus simple.

Il existe un bon article dans MSDN Magazine sur ce sujet, WPF Apps avec le modèle de conception Model-View-ViewModel: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

Selon cet article, dans la section Modèle de données et référentiel ( http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090102 ), vous trouverez une implémentation simple. Le client est la classe d'entité et ViewModel obtient les indicateurs d'erreur de l'entité.

Vous pouvez utiliser ValidationsRule pour vérifier la validité des données:

<TextBox x:Name="title" VerticalAlignment="Top" TextWrapping="Wrap" Grid.Column="1" MinWidth="20">
  <TextBox.Text>
    <Binding Path="Title" UpdateSourceTrigger="LostFocus">
      <Binding.ValidationRules>
        <Validators:StringRangeValidationRule MinimumLength="1" MaximumLength="30" 
                                            ErrorMessage="Address is required and must be less than 30 letters." />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

Voici un exemple de style de validateur:

<Application.Resources>
  <Style TargetType="{x:Type TextBox}">
  <Setter Property="Validation.ErrorTemplate">
    <Setter.Value>
      <ControlTemplate>
        <DockPanel LastChildFill="True">
          <Image Source="/Images/error.png" Width="25" Height="25" ToolTip="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
          <TextBlock DockPanel.Dock="Right"
              Foreground="Orange"
              Margin="5" 
              FontSize="12pt"
              Text="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
          </TextBlock>

          <Border BorderBrush="Red" BorderThickness="3">
          <AdornedElementPlaceholder Name="MyAdorner" />
        </Border>
      </DockPanel>
    </ControlTemplate>
  </Setter.Value>
</Setter>
<Style.Triggers>
  <Trigger Property="Validation.HasError" Value="true">
    <Setter Property="ToolTip"
        Value="{Binding RelativeSource={RelativeSource Self}, 
        Path=(Validation.Errors)[0].ErrorContent}"/>
  </Trigger>
</Style.Triggers>


Exemple d'application BookLibrary du infrastructure d'application WPF pourrait être intéressant pour vous. Il implémente l'interface IDataErrorInfo également sur les objets de domaine et utilise le modèle M-V-VM.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top