2016-08-19 2 views
0

에 INotifyDataErrorInfo을 바탕으로, 내가 수동으로 검증이 https://stackoverflow.com/questions/39031783/screen-validation-with-data-annotations-on-button-click-in-using-inotifydataerro/39033124#39033124이 업데이트 BOOL 재산권 내 이전 질문에서 WPF C#을

나는 모델 Person에 봉착 결과 확인하는 방법에 대한 해결책을 가지고, 그것은 (필수) 세 가지 속성 FirstName을 포함, MiddleName (선택 사항) 및 LastName (필수).

가 지금은 내 코드 만 약간

public class PersonViewModel : BaseViewModel, INotifyDataErrorInfo { 

    private string _personObj = string.Empty; 

    public Person PersonObj 
    { 
     get { return _personObj; } 
     set { _personObj= value; OnPropertyChanged(); } 
    } 

    public bool IsValidObject 
    { 
     get 
     { 
      var context = new ValidationContext(EmpInfo, null, null); 
      bool flag = Validator.TryValidateObject(EmpInfo, context, null, true); 
      return flag; 
     } 
    } 

    public ICommand SaveDataCommand 
     { 
      get 
      { 
       return new DelegatingCommand(SaveData); 
      } 
     } 

    public void SaveData 
     { 
      // Validate Data; 
     } 

} 

모델 클래스 변경 : 사람을

public class Person 
{ 
    [Required] 
    public string FirstName { get; set; } 

    public string MiddleName { get; set; } 

    [Required] 
    public string LastName { get; set; } 
} 

내 XAML은

<TextBox Text="{Binding PersonObj.FirstName, UpdateSourceTrigger=PropertyChanged, 
,ValidatesOnNotifyDataErrors=True}" /> 

<TextBox Text="{Binding PersonObj.MiddleName, UpdateSourceTrigger=PropertyChanged, 
,ValidatesOnNotifyDataErrors=True}" /> 

<TextBox Text="{Binding PersonObj.LastName, UpdateSourceTrigger=PropertyChanged, 
,ValidatesOnNotifyDataErrors=True}" /> 

<Button Content="Save" IsDefault="True" IsEnabled="{Binding IsValidObject}" Command="{Binding SaveDataCommand}" /> 

본 숙박 IsValidObject은 처음에는 잘 작동합니다. FirstNameLastName의 값을 업데이트하면 IsValidObject 속성은 UI의 결과를 업데이트하지 않습니다.

나는 내가이 방법 ValidateEmployeeObject(), 그것은 반환 도입 한 번 더 접근 여기

public class PersonViewModel : BaseViewModel, INotifyDataErrorInfo { 

    private string _personObj = string.Empty; 

    public Person PersonObj 
    { 
     get { return _personObj; } 
     set { _personObj= value; OnPropertyChanged(); } 
    } 

    public bool IsValidObject 
    { 
     get 
     { 
      var context = new ValidationContext(EmpInfo, null, null); 
      bool flag = Validator.TryValidateObject(EmpInfo, context, null, true); 
      return flag; 
     } 
    } 

    public ICommand SaveDataCommand 
     { 
      get 
      { 
       return new DelegatingCommand(SaveData, ValidateEmployeeObject); 
      } 
     } 


    public bool ValidateEmployeeObject() 
    { 
     var context = new ValidationContext(EmpInfo, null, null); 
     bool flag = Validator.TryValidateObject(EmpInfo, context, ErrorResult, true); 
     return flag; 
    } 

    public void SaveData 
     { 
      // Validate Data; 
     } 

} 

을 사용하는 속성 IsValidObject에 유사한 TRUE/FALSE. 나는이 메서드를 CanExecute 블록에 바인딩했다. SaveDataCommand의 블록은 주석 부분에 @adminSoftDK가 제안했다. 이 접근법 역시 실패합니다 ...

위의 유효성 확인을 기반으로 사용하도록 설정을 저장하려면 어떻게해야합니까?

+0

여기에 몇 가지 문제가 있습니다. IsValidObject는 문자열이지만 Bool을 반환하려고하기 때문에 우선 컴파일이 의심 스럽습니다. 둘째 IsEnabled는 변환기가 없으면 문자열에 바인딩 할 수 없습니다. 쉬운 접근법이 있습니다. 명령에 CanExecute를 사용할 수 있으며 IsValidObject가 RaiseCanExecute를 수행해야합니다. 버튼이 비활성화되거나 자동으로 활성화됩니다. 사용하지 않아도됩니다. – adminSoftDK

+0

@adminSoftDK - 'bool' 속성입니다. 실수를 입력 ... –

+0

@adminSoftDK CanExecute 접근 방식이 너무 작동하지 않습니다 ... 친절하게 도와주세요 ... –

답변

0

당신은 내가 INotifyDataErrorInfo 매우 익숙하지 그리고 난 어떤 시점에서이 당신의 IsValidObject가 호출되어 모르는이

public PersonViewModel() 
{ 
    SaveDataCommand = new DelegatingCommand(SaveData,()=> flag); 
} 

bool flag; 

public bool IsValidObject 
{ 
    get 
    { 
     var context = new ValidationContext(EmpInfo, null, null); 
     flag = Validator.TryValidateObject(EmpInfo, context, null, true); 
     SaveDataCommand.RaiseCanExecute() // don't know what type of command you have but you should have a method which you can call something with Canexecute 
     return flag; 
    } 
} 

public bool ValidateEmployeeObject() 
{ 
    return IsValidObject; 
} 

public ICommand SaveDataCommand { get; } 

같은 시도,하지만 난 위의 같은이 일을해야한다고 생각합니다.