에 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
은 처음에는 잘 작동합니다. FirstName
및 LastName
의 값을 업데이트하면 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가 제안했다. 이 접근법 역시 실패합니다 ...
위의 유효성 확인을 기반으로 사용하도록 설정을 저장하려면 어떻게해야합니까?
여기에 몇 가지 문제가 있습니다. IsValidObject는 문자열이지만 Bool을 반환하려고하기 때문에 우선 컴파일이 의심 스럽습니다. 둘째 IsEnabled는 변환기가 없으면 문자열에 바인딩 할 수 없습니다. 쉬운 접근법이 있습니다. 명령에 CanExecute를 사용할 수 있으며 IsValidObject가 RaiseCanExecute를 수행해야합니다. 버튼이 비활성화되거나 자동으로 활성화됩니다. 사용하지 않아도됩니다. – adminSoftDK
@adminSoftDK - 'bool' 속성입니다. 실수를 입력 ... –
@adminSoftDK CanExecute 접근 방식이 너무 작동하지 않습니다 ... 친절하게 도와주세요 ... –