Pregunta

Si mis objetos de dominio implementan IDataErrorInfo y estoy usando M-V-VM, ¿cómo propago los errores a través de ViewModel a View? Si estuviera vinculando directamente al modelo, establecería el " ValidateOnExceptons " y "ValidateOnErrors" propiedades a verdadero en mi enlace. Pero mi ViewModel no implementa IDataErrorInfo. Solo mi modelo. ¿Qué hago?

Aclaración Estoy tratando con una base de código existente que implementa IDataErrorInfo en los objetos de dominio. No puedo simplemente implementar IDataErrorInfo en el modelo mi vista.

¿Fue útil?

Solución

Puede implementar IDataErrorInfo adicionalmente en su VM y enrutar las llamadas a la VM a sus objetos de dominio correspondientes. Creo que esta es la única forma sin exponer los objetos de dominio directamente a la vista.

Otros consejos

si está utilizando M-V-VM, ViewModel debe definir la interfaz IDataErrorInfo, no el modelo.

Se podría decir que la interfaz IDataErrorInfo es solo para la vista y no pertenece al modelo, pero es una cuestión de estilo.

Hacer que ViewModel implemente la interfaz IDataErrorInfo y propague los errores del modelo sería la respuesta más simple.

Hay un buen artículo de MSDN Magazine sobre este tema, Aplicaciones WPF con el patrón de diseño Model-View-ViewModel: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

Según este artículo, en la sección The Data Model and Repository ( http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090102 ) encontrará una implementación sencilla. El Cliente es la clase de entidad y ViewModel obtiene los indicadores de error de la entidad.

Puede usar ValidationsRule para verificar la validez de los datos:

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

Este es un ejemplo de estilo de validación:

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


La aplicación de muestra BookLibrary de Marco de aplicaciones WPF (WAF) puede ser interesante para usted. Implementa la interfaz IDataErrorInfo también en los objetos de dominio y utiliza el patrón M-V-VM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top