2011-09-27 5 views
4

데이터 유효성 검사를 수행하는 가장 좋은 방법은 무엇입니까? 뷰 모델에서 유효성 검사를 수행하거나 모델에서 유효성 검사를 수행해야합니까? 또한 MVVM을 사용하여 WPF에서 숫자 (10 진수) 텍스트 상자를 구현하는 가장 좋은 방법은 무엇입니까? MVVM Light 툴킷을 사용하고 있습니다.MVVM 표시 등의 데이터 유효성 검사

+0

내 모델의 모델 개체가 서비스에 노출되어 있기 때문에 모델이 아닌보기 모델에서 유효성 검사를 더 많이 기울이고 있습니다. 나는 그 서비스에 대한 통제권을 가지고있다. 유효성 검사는 뷰에 따라 다르므로 뷰 모델에서 수행하는 것이 더 좋을 것이라고 생각합니다. 뷰에서는 속성에 값을 할당해야하지만 다른 경우에는 선택적 일 수 있습니다. – katie77

답변

6

사용자에게 의미있는 메시지를 제공하려면 ViewModel의 속성을 String 유형의 TextBox에 바인딩하고 ViewModel에 IDataErrorInfo을 구현하는 것이 가장 좋습니다.

내 프로젝트에서 나는 이것을 이렇게 사용하고 있습니다. IDataErrorInfo를 구현하는 인터페이스 IValidateable (이름을 용서하십시오 ...)을 만들었습니다. 내 뷰 모델은이 인터페이스를 구현 : 입력 한 값 내 규칙을 준수하지 않는 경우

<Style TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" 
       Value="true"> 
     <Setter Property="ToolTip" 
       Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
     </Trigger> 
    </Style.Triggers> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
     <ControlTemplate> 
      <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="90*" /> 
       <ColumnDefinition Width="20" /> 
      </Grid.ColumnDefinitions> 
      <Border BorderBrush="Red" 
        BorderThickness="1" 
        CornerRadius="2.75" 
        Grid.Column="0"> 
       <AdornedElementPlaceholder Grid.Column="0" /> 
      </Border> 
      <TextBlock Foreground="Red" 
         Grid.Column="1" 
         Margin="0" 
         FontSize="12" 
         VerticalAlignment="Center" 
         HorizontalAlignment="Left"> 
       * 
      </TextBlock> 
      </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 

이것은 도구 팁을 표시합니다 :

public interface IValidateable : IDataErrorInfo 
{ 
    ObservableCollection<Tuple<string, ValidationError>> InvalidProperties 
    { get; } 
    bool IsValid { get; } 
} 

내 모든 텍스트 상자는 다음 스타일을 사용합니다.

또한 뷰 모델의 속성에 규칙을 할당 할 수있는 작은 유효성 검사 엔진을 만들었으며 새 값이 설정되면 속성 값을 자동으로 확인하는 기본 클래스를 만들었습니다.
IValidateable의 인터페이스 구성원은 잘못된 개체를 저장하려고 할 때 사용자에게 의미있는 오류 메시지를 표시하는 데 사용됩니다.

1

클래스에 IDataError 정보를 구현하고 그 두 가지 속성 오류를 구현하고이 [문자열 COLUMNNAME] 당신은 당신이

public class MainViewModel:ViewModelBase,IDataErrorInfo 
{ 

public string Error 
    { 
    } 
public string this[string columnName] 

{ 
    get 
     { 
     string msg=nulll; 
     switch(columnName) 
      { 
       case "MyProperty": //that will be your binding property 
       //choose your validation logic 
       if(MyProperty==0||MyProperty==null) 
       msg="My Property is required"; 
       break; 
      } 
     return msg; 
     } 
} 

을하려는 바인딩 오류와 함께 두 번째 속성을 구현할 수 있습니다 또한에 ValidateOnError가 = true로 설정

당신의 ViewModel 다른 특성이있는 경우 다음 대해서 typeof 문자열과보기에서 입력 할 수 없습니다 전환 : - 당신의 ViewModel 확인을 위해 IDataErrorInfo를 사용하는 경우 필드

+0

제 경우에는 모델에서이를 수행하기 위해 모델 객체가 서비스에 의해 노출되었습니다. 나는 그 서비스에 대한 통제권을 가지고있다. 유효성 검사는 뷰에 따라 다르므로 뷰 모델에서 수행하는 것이 더 좋을 것이라고 생각합니다. 뷰에서는 속성에 값을 할당해야하지만 다른 경우에는 선택적 일 수 있습니다. – katie77

+0

모델에서도 그렇게 할 수 있습니다! For Example 로컬 뷰 모델의 MyProperty에 바인딩 된 TextBox가 있습니다. 그러나 만약 모델을 누른 다음 Object.of 모델. IDataErrorInfo는 HelperClass에 구현되어야합니다. –

0

은 다음과 잊지 마세요 속성 유형에 대한 오류가 발생했습니다. 그러면 입력이 viewmodel에 도달하지 않으므로 유효성 검사가 수행되고 뷰 앞의 사용자는 "왜 유효성 검사 오류가 표시되지 않습니까?"라고 생각하는 것입니다.

관련 문제