2008-12-04 11 views
11

Si mis objetos de dominio implementan IDataErrorInfo, y estoy usando M-V-VM, ¿cómo puedo propagar 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?Uso de IDataErrorInfo en M-V-VM

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

Respuesta

17

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.

+0

¿Qué está utilizando para enrutar las llamadas a la implementación de máquina virtual desde la entidad enlazada? – TheCodeKing

+0

No lo implementé, pero creo que tiene que hacerlo manualmente – MarioH

+0

Hmm no suena factible, estoy buscando una manera de decirle a WPF que busque IDataErrorInfo en el modelo de vista. – TheCodeKing

6

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

+0

La misma pregunta que arriba, ¿cómo se propagan los errores de la entidad al modelo veiwmodel? ¿Has logrado hacer esto? – TheCodeKing

+3

Esta respuesta contradice las mejores prácticas de MS (http://msdn.microsoft.com/en-us/library/gg405484(v=PandP.40).aspx): por lo general, el modelo implementa las funciones que hacen que sea más fácil enlazar a la vista. Esto generalmente significa que es compatible con la propiedad y la notificación de cambio de colección a través de las interfaces INotifyPropertyChanged e INotifyCollectionChanged. El modelo también puede admitir la validación de datos y el informe de errores a través de las interfaces IDataErrorInfo (o INotifyDataErrorInfo). Estas interfaces permiten que WPF y el enlace de datos de Silverlight sean notificados cuando cambian los valores para que la interfaz de usuario se pueda actualizar – Pat

+7

@Pat. No estoy seguro de estar de acuerdo con eso. El modelo no debe estar contaminado con problemas de UI. Implementar un par de interfaces en el modelo solo para hacer que la interfaz de usuario sea feliz no se siente bien, para eso es para ViewModel. Por otra parte, todo depende de la complejidad del modelo, el tamaño y el tipo del proyecto, etc. No creo que haya una respuesta verdadera. Pero trataría de mantener el modelo limpio de cualquier preocupación fuera de la lógica comercial. – gcores

3

Hay un buen artículo MSDN Magazine sobre este tema, WPF Aplicaciones Con El Modelo-Vista-ViewModel Diseño Patrón: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

De acuerdo con este artículo, en el modelo de datos y la sección 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 utilizar ValidationsRule para comprobar la validez de 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 un 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> 


0

El BookLibrary aplicación muestra de la 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 M-V-VM.

Cuestiones relacionadas