Pergunta

Se meus objetos de domínio implementação IDataErrorInfo, e eu estou usando M-V-VM, como eu propagar erros por meio de ViewModel para a vista? Se eu estava ligando diretamente para o modelo, gostaria de definir os "ValidateOnExceptons" e propriedades "ValidateOnErrors" a verdade sobre a minha ligação. Mas a minha ViewModel não implementa IDataErrorInfo. Só o meu modelo. O que eu faço?

Clarificação Estou lidando com uma base de código existente que implementa IDataErrorInfo no domínio objetos. Eu não posso simplesmente implementar IDataErrorInfo no modelo de meu ponto de vista.

Foi útil?

Solução

Você pode implementar IDataErrorInfo, adicionalmente, em sua VM e via as chamadas para o VM para seus correspondentes objetos de domínio. Eu acho que esta é a única maneira sem expor objetos de domínio diretamente para a vista.

Outras dicas

Se você estiver usando M-V-VM, o ViewModel deve definir a interface IDataErrorInfo, não o modelo.

Pode-se dizer que a interface IDataErrorInfo é apenas para a vista e não pertencem ao modelo, mas isso é uma questão de estilo.

Ter o ViewModel implementar a interface IDataErrorInfo e propagar os erros do modelo seria a resposta mais simples.

Há um bom artigo MSDN Magazine sobre este tema, WPF Apps com o Model-View-ViewModel Design Pattern: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

De acordo com este artigo, no modelo de dados e seção Repository ( http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090102 ) você vai encontrar uma implementação simples. O cliente é a classe de entidade eo ViewModel recebe os indicadores de erro da entidade.

Você pode usar ValidationsRule para verificar a validade dos dados:

<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 é um exemplo de validador styling:

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


O BookLibrary aplicação de exemplo do WPF Application Framework (WAF) pode ser interessante para você. Ele implementa a interface IDataErrorInfo, bem como sobre os objetos de domínio e usa o padrão M-V-VM.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top