Domanda

Se i miei oggetti di dominio implementano IDataErrorInfo e sto usando M-V-VM, come posso propagare gli errori attraverso ViewModel nella vista? Se avessi eseguito l'associazione direttamente al modello, avrei impostato l'opzione "ValidateOnExceptons" e " ValidateOnErrors " proprietà true sul mio binding. Ma il mio ViewModel non implementa IDataErrorInfo. Solo il mio modello. Cosa devo fare?

Chiarimento Ho a che fare con una base di codice esistente che implementa IDataErrorInfo negli oggetti dominio. Non posso semplicemente implementare IDataErrorInfo nel mio modello di visualizzazione.

È stato utile?

Soluzione

È possibile implementare ulteriormente IDataErrorInfo nella VM e instradare le chiamate alla VM verso gli oggetti di dominio corrispondenti. Penso che questo sia l'unico modo senza esporre gli oggetti di dominio direttamente alla vista.

Altri suggerimenti

se si utilizza M-V-VM, ViewModel dovrebbe definire l'interfaccia IDataErrorInfo, non il modello.

Si potrebbe dire che l'interfaccia IDataErrorInfo è solo per la vista e non appartiene al modello, ma è una questione di stile.

Avere ViewModel implementare l'interfaccia IDataErrorInfo e propagare gli errori dal modello sarebbe la risposta più semplice.

C'è un buon articolo di MSDN Magazine su questo argomento, App WPF con il modello di progettazione Model-View-ViewModel: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

Secondo questo articolo, nella sezione Modello di dati e repository ( http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090102 ) troverai una semplice implementazione. Il cliente è la classe di entità e ViewModel ottiene gli indicatori di errore dall'entità.

Puoi utilizzare ValidationsRule per verificare la validità dei dati:

<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>

Questo è un esempio di stile validatore:

<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>


L'applicazione di esempio BookLibrary del WPF Application Framework (WAF) potrebbe essere interessante per te. Implementa anche l'interfaccia IDataErrorInfo sugli oggetti del dominio e utilizza il modello M-V-VM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top