wpf - Usando IDataErrorInfo en MV-VM
validation mvvm (4)
si está utilizando MV-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 esa es una cuestión de estilo.
Tener el ViewModel implementar la interfaz IDataErrorInfo y propagar los errores desde el modelo sería la respuesta más simple.
Si los objetos de mi dominio implementan IDataErrorInfo, y estoy usando MV-VM, ¿cómo propago los errores a través del ViewModel en la Vista? Si me estaba vinculando directamente al modelo, establecería las propiedades "ValidateOnExceptons" y "ValidateOnErrors" en true en mi enlace. Pero mi ViewModel no implementa IDataErrorInfo. Solo mi modelo. ¿Qué debo hacer?
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 mi modelo de vista.
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 manera sin exponer objetos de dominio directamente a la vista.
Hay un buen artículo de MSDN Magazine sobre este tema, Aplicaciones de 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 El modelo de datos y repositorio ( http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090102 ) encontrará una implementación simple. 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 validador:
<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 del WPF Application Framework (WAF) puede ser interesante para usted. Implementa la interfaz IDataErrorInfo también en los objetos de dominio y utiliza el patrón MV-VM.