MV-VM에서 IdataerRorinfo 사용
-
19-08-2019 - |
문제
내 도메인 객체가 IdataerRorinfo를 구현하고 MV-VM을 사용하는 경우 뷰 모델을 통해 오류를보기로 어떻게 전파합니까? 모델에 직접 바인딩되면 바인딩에서 "ValidateOnexceptons"및 "ValidateOnerrors"속성을 true로 설정합니다. 그러나 내 뷰 모델은 IdataerRorinfo를 구현하지 않습니다. 내 모델 만. 내가 어떻게해야하나요?
설명도메인 객체에서 idataerrorinfo를 구현하는 기존 코드베이스를 다루고 있습니다. My View 모델에서 IdataerRorinfo를 구현할 수는 없습니다.
해결책
VM에서 IdataerRorinfo를 추가로 구현하고 VM으로 호출을 해당 도메인 개체로 라우팅 할 수 있습니다. 도메인 객체를보기에 직접 노출시키지 않고는 이것이 유일한 방법이라고 생각합니다.
다른 팁
MV-VM을 사용하는 경우 ViewModel은 모델이 아닌 IdataErrorInfo 인터페이스를 정의해야합니다.
IdataerRorinfo 인터페이스는보기를위한 것이며 모델에 속하지 않지만 스타일의 문제라고 말할 수 있습니다.
ViewModel이 IdataErrorInfo 인터페이스를 구현하고 모델에서 오류를 전파하는 것이 가장 간단한 대답입니다.
이 주제에 대한 좋은 MSDN 매거진 기사가 있습니다. WPF 앱은 Model-View-ViewModel 디자인 패턴을 사용합니다. http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
이 기사에 따르면 데이터 모델 및 저장소 섹션 (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090102) 간단한 구현을 찾을 수 있습니다. 고객은 엔티티 클래스이며 뷰 모델은 엔티티에서 오류 표시기를 가져옵니다.
ValidationSrule을 사용하여 데이터 유효성을 확인할 수 있습니다.
<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>
이것은 유효성 검사기 스타일의 예입니다.
<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>
그만큼 책장 샘플 적용 WPF 응용 프로그램 프레임 워크 (WAF) 당신에게 흥미로울 수 있습니다. 도메인 객체에서 IdataerRorinfo 인터페이스를 구현하고 MV-VM 패턴을 사용합니다.