가장 간단한 방법은 그 당신을 위해 작동하지 않는 경우 bathineni suggests
private DateTime StartDate
{
get { return _startDate; }
set
{
if (_startDate != value)
{
_startDate = value;
RaisePropertyChanged("StartDate");
RaisePropertyChanged("EndDate");
}
}
}
private DateTime EndDate
{
get { return _endDate; }
set
{
if (_endDate!= value)
{
_endDate= value;
RaisePropertyChanged("StartDate");
RaisePropertyChanged("EndDate");
}
}
}
처럼 검증해야 할 두 속성에 대한 세터에 대한 PropertyChanged
통지를 인상하는 것입니다, 나는 한 가지 방법을 알아 냈 수업은 (필자는 두 인터페이스를 구현 EntityFramework 기본적으로 자신의 클래스를 사용하고 있습니다)
확장 메서드
01,235
INotifyPropertyChanged
에 추가
INotifyPropertyChanging
을 구현해야하지만, 함께 속성 그룹을 확인
public static class ValidationGroup
{
public delegate string ValidationDelegate(string propertyName);
public delegate void PropertyChangedDelegate(string propertyName);
public static void AddValidationGroup<T>(this T obj,
List<string> validationGroup, bool validationFlag,
ValidationDelegate validationDelegate,
PropertyChangedDelegate propertyChangedDelegate)
where T : INotifyPropertyChanged, INotifyPropertyChanging
{
// This delegate runs before a PropertyChanged event. If the property
// being changed exists within the Validation Group, check for validation
// errors on the other fields in the group. If there is an error with one
// of them, set a flag to true.
obj.PropertyChanging += delegate(object sender, PropertyChangingEventArgs e)
{
if (validationGroup.Contains(e.PropertyName))
{
foreach(var property in validationGroup)
{
if (validationDelegate(property) != null)
{
validationFlag = true;
break;
}
}
}
};
// After the Property gets changed, if another field in this group was
// invalid prior to the change, then raise the PropertyChanged event for
// all other fields in the Validation Group to update them.
// Also turn flag off so it doesn't get stuck in an infinite loop
obj.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
if (validationGroup.Contains(e.PropertyName))
{
if (validationFlag && validationDelegate(e.PropertyName) == null)
{
validationFlag = false;
foreach(var property in validationGroup)
{
propertyChangedDelegate(property);
}
}
}
};
}
}
사용하려면 속성 그룹을 함께 확인해야하는 모든 클래스의 생성자에 다음 호출을 추가하십시오.
this.AddValidationGroup(
new List<string> { "StartDate", "EndDate" },
GetValidationError, OnPropertyChanged);
유효성 검사 그룹에서 최대 3 개의 속성을 테스트했으며 정상적으로 작동하는 것 같습니다.
대체 방법을 사용하면 두 규칙 중 하나가 잘못되었을 때 빨간색으로 표시 될 수 있습니까? 그렇다면 하나의 propertychanged 이벤트 만 올리면됩니다. – Josh
@ Josh는 좋아 하겠지만 개별 속성에 대한 유효성 검사 이벤트를 수동으로 발생시키는 방법을 모르겠습니다. – Rachel
유효성 검사 이벤트를 사용하여 종료합니다.나는 그들이 화재를 당해야한다고 생각하는 곳에서 그들과 너무 많은 문제를 겪었고, 화재가 발생하지 않았거나 화재가 발생하고 국경이 강조 표시되지 않습니다. 유효한 BOOLEAN 표현에 바인딩 된 Red Border 스타일을 사용합니다. 또한 툴팁을 메시지 속성에 바인딩합니다. 그런 다음 값이 변경되면 유효성을 검사하고 속성을 적절하게 설정합니다. – Josh