Frage

Wenn mein Domain-Objekte IDataErrorInfo implementieren, und ich bin mit M-V-VM, wie verbreiten ich Fehler durch das Viewmodel in die View? Wenn ich direkt an das Modell wurde zu binden, würde ich die „ValidateOnExceptons“ gesetzt und „ValidateOnErrors“ Eigenschaften auf true auf meiner Bindung. Aber mein Viewmodel nicht IDataErrorInfo implementieren. Nur mein Modell. Was kann ich tun?

Klarstellung Ich beschäftige mich mit einer bestehenden Code-Basis, die IDataErrorInfo in den Domain-Objekten implementiert. Ich kann nicht nur implementieren IDataErrorInfo in der meiner Ansicht nach Modell.

War es hilfreich?

Lösung

Sie können IDataErrorInfo implementieren zusätzlich in Ihrer VM und die Anrufe an die VM auf Ihre entsprechenden Domänenobjekte. Ich denke, dass dies der einzige Weg ist Domain-Objekte direkt zu der Ansicht, ohne auszusetzen.

Andere Tipps

Wenn Sie M-V-VM verwenden, sollte das Ansichtsmodell die IDataErrorInfo Schnittstelle definieren, nicht das Modell.

Man könnte sagen, dass die IDataErrorInfo Schnittstelle nur für die Ansicht und es gehört nicht in dem Modell, aber das ist eine Frage des Stils.

Mit dem Viewmodel der IDataErrorInfo-Schnittstelle implementieren und die Fehler aus dem Modell zu propagieren wäre die einfachste Antwort sein.

Es gibt einen guten MSDN Magazin-Artikel zu diesem Thema WPF Apps mit dem Model-View-Viewmodel Design-Muster: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

Laut diesem Artikel, in dem Datenmodell und Repository Abschnitt ( http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090102 ) finden Sie eine einfache Implementierung finden. Der Kunde ist die Entity-Klasse und das Ansichtsmodell erhält die Fehlerindikatoren aus der Einheit.

Sie können ValidationsRule verwenden, um Daten Gültigkeit zu überprüfen:

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

Dies ist ein Beispiel für Validator 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>


Die Booklibrary Beispielanwendung der WPF Application Framework (WAF) könnte für Sie interessant sein. Es implementiert die IDataErrorInfo Schnittstelle als auch über die Domain-Objekte und verwendet die M-V-VM-Muster.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top