Валидация данных¶
Механизм валидации данных позволяет проверять значения ячеек и показывать ошибки в ячейках, содержащих недопустимые данные.
Контролы TreeList и TreeView выполняют валидацию данных, когда пользователь изменяет значение ячейки, а затем пытается сохранить (опубликовать) это значение. Контролы также запускают механизм валидации для вновь отображаемых ячеек и ячеек, обновляемых в коде, даже если пользователь не изменял значения ячеек.
Проверка значений при изменении Пользователем данных Ячейки¶
Контролы TreeList и TreeView активируют механизм валидации значений ячеек, когда пользователь изменяет значение ячейки и пытается сохранить его в источнике данных (например, пользователь нажимает клавишу ENTER или перемещает фокус на другую ячейку). На следующей диаграмме показаны этапы механизма валидации, выполняемые, когда пользователь изменяет значение ячейки:
-
Встроенный редактор ячейки выполняет валидацию начального значения во время ввода данных. Например,
SpinEditor
, который принимает только числовые значения, показывает ошибки, если пользователь пытается ввести букву.Пользователь не может покинуть ячейку до тех пор, пока не будет введено допустимое значение или нажата клавиша ESC, которая возвращает значение к предыдущему.
-
Контрол TreeList/TreeView проверяет, применяются ли Атрибуты DataAnnotations к бизнес-объекту источника данных, а затем проверяет данные в соответствии с этими правилами. Этот этап валидации включен, если свойству
DataControlBase.ShowItemsSourceErrors
присвоено значениеtrue
(значение по умолчанию).Пользователь не может покинуть ячейку до тех пор, пока не будет введено допустимое значение или нажата клавиша ESC, которая возвращает значение к предыдущему.
-
Контрол запускает Событие
DataControlBase.ValidateCellValue
, которое вы можете обработать для реализации валидации пользовательского значения.Пользователь не может покинуть ячейку до тех пор, пока не будет введено допустимое значение или нажата клавиша ESC, которая возвращает значение к предыдущему.
-
Контрол публикует значение ячейки. На этом шаге источник данных может вызывать исключения, если опубликованные данные неверны. Контрол показывает ошибку в ячейке, если перехватывается какое-либо исключение.
Пользователь не может покинуть ячейку до тех пор, пока не будет введено допустимое значение или нажата клавиша ESC, которая возвращает значение к предыдущему.
-
Контрол TreeList/TreeView проверяет, реализует ли бизнес-объект IDataErrorInfo или Интерфейс INotifyDataErrorInfo , и использует эти интерфейсы для извлечения ошибок ячейки, если таковые имеются. Этот этап валидации включен, если свойству
DataControlBase.ShowItemsSourceErrors
присвоено значениеtrue
(значение по умолчанию).Контрол позволяет пользователю покинуть ячейку, если значение ячейки является недопустимым, поскольку значение уже было разнесено.
Проверка значений вновь отображаемых ячеек и ячеек, обновленных в коде¶
Контролы поддерживают механизм валидации для вновь отображаемых и обновленных ячеек, даже если пользователь не изменял значения ячеек. Контрол проверяет значения ячеек в следующих случаях:
- Первоначально отображается контрол, и поэтому ячейки рисуются в пределах области просмотра.
- Ячейка становится видимой при прокрутке контрола.
- Значение ячейки изменяется в коде, и поэтому контролу необходимо перерисовать ячейку.
На следующей диаграмме показаны этапы механизма валидации в этих сценариях:
-
Контрол TreeList/TreeView проверяет, применяются ли Атрибуты DataAnnotations к бизнес-объекту источника данных, а затем проверяет данные в соответствии с этими правилами. Этот этап валидации включен, если свойством
DataControlBase.ShowItemsSourceErrors
являетсяtrue
(значение по умолчанию). -
Контрол TreeList/TreeView проверяет, реализует ли бизнес-объект IDataErrorInfo или Интерфейс INotifyDataErrorInfo , и использует эти интерфейсы для извлечения ошибок ячейки, если таковые имеются. Этот этап валидации включен, если свойству
DataControlBase.ShowItemsSourceErrors
присвоено значениеtrue
(значение по умолчанию). -
Контрол запускает Событие
DataControlBase.ValidateCellValue
, которое вы можете обработать для реализации валидации пользовательского значения. Этот этап валидации включен, если свойствомDataControlBase.ValidateCellValuesOnShowAndUpdate
являетсяtrue
(значение по умолчанию -false
).
Правила валидации источника данных¶
Если свойство DataControlBase.ShowItemsSourceErrors
включено (дефолтное поведение), контрол TreeList/TreeView проверяет данные, используя атрибуты DataAnnotations
и интерфейс IDataErrorInfo
, применяемые к бизнес-объекту источника данных.
Атрибуты DataAnnotations¶
Вы можете применить атрибуты валидации DataAnnotations
(потомки System.ComponentModel.DataAnnotations.ValidationAttribute
) к бизнес-объекту, чтобы указать правила валидации для свойств объекта. В приведенном ниже списке приведены наиболее распространенные атрибуты валидации:
CompareAttribute
— Предоставляет атрибут, который сравнивает два свойства.CustomValidationAttribute
— Указывает пользовательский метод валидации, который используется для проверки свойства или экземпляра класса.MaxLengthAttribute
— Указывает максимальную длину массива или строковых данных, допустимую для свойства.MinLengthAttribute
— Указывает минимальную длину массива или строковых данных, допустимую для свойства.RangeAttribute
— Определяет ограничения числового диапазона для значения поля данных.RegularExpressionAttribute
— Указывает, что значение поля данных должно соответствовать указанному регулярному выражению.RequiredAttribute
— Указывает, что требуется ввести значение в поле данных.StringLengthAttribute
— Указывает минимальную и максимальную длину символов, допустимую в поле данных.
Пример¶
Следующий код применяет атрибут StringLength
к свойству Code бизнес-объекта. Атрибут заставляет пользователя вводить строку, содержащую не менее 4, но не более 8 символов.
public partial class Department : ObservableObject, IDataErrorInfo
{
//...
[ObservableProperty]
[property: StringLength(8, MinimumLength = 4)]
public string code = "0000";
}
Интерфейс 'IDataErrorInfo'¶
Вы можете реализовать следующее System.ComponentModel.IDataErrorInfo
интерфейс для бизнес-объекта для указания правил валидации свойств бизнес-объекта.
В настоящее время контролы TreeList и TreeView поддерживают ошибки только для отдельных ячеек, а не для целых строк. Таким образом, действует только свойство IDataErrorInfo.Item[String]
, а свойство IDataErrorInfo.Error
игнорируется.
Пример - Реализация интерфейса 'IDataErrorInfo'¶
В следующем примере реализован интерфейс IDataErrorInfo
для бизнес-объекта, который возвращает ошибку, если свойство Phone является пустым.
public partial class Department : ObservableObject, IDataErrorInfo
{
//...
[ObservableProperty]
public string phone = "0";
string IDataErrorInfo.this[string columnName]
{
get
{
if (columnName != "Phone")
return "";
return string.IsNullOrEmpty(this.Phone) ? "Please specify the phone number" : "";
}
}
string IDataErrorInfo.Error
{
get { return ""; }
}
}
Интерфейс 'INotifyDataErrorInfo'¶
Интерфейс System.ComponentModel.INotifyDataErrorInfo
позволяет реализовать пользовательские правила валидации на уровне бизнес-объекта. Интерфейс поддерживает синхронную и асинхронную валидацию, множественные ошибки для каждого свойства и ошибки между свойствами.
Пример - Реализация интерфейса 'INotifyDataErrorInfo'¶
В следующем примере демонстрируется, как реализовать интерфейс INotifyDataErrorInfo
для бизнес-объекта (ProjectTask). Интерфейс используется для определения правил валидации для свойства ProjectTask.EstimateTime. Когда значение свойства нарушает правила валидации, контрол TreeList отображает сообщение об ошибке в соответствующей ячейке.
Реализация интерфейса INotifyDataErrorInfo
, показанная ниже, поддерживает несколько ошибок для каждого свойства одновременно.
<mxtl:TreeListControl x:Name="treeList" ItemsSource="{Binding Tasks}"...>
<mxtl:TreeListColumn FieldName="EstimateTime" Header="Estimate Time (h)" Width="*" />
</mxtl:TreeListControl>
public partial class TreeListDataEditorsPageViewModel : PageViewModelBase
{
//...
public List<ProjectTask> Tasks { get; }
}
public partial class ProjectTask : ObservableObject, INotifyDataErrorInfo
{
public ProjectTask(ProjectTask parent, string description, TaskStatus status,
int estimateTime, int timeSpent, string assignee, DateTime dueDate)
{
Tasks = new();
Parent = parent;
this.estimateTime = estimateTime;
//...
}
[ObservableProperty]
private int estimateTime;
private Dictionary<string, List<string>> propertyErrors = new Dictionary<string, List<string>>();
partial void OnEstimateTimeChanged(int oldValue, int newValue) => ValidateEstimateTime();
public bool HasErrors => propertyErrors.Any();
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (propertyErrors.ContainsKey(propertyName))
return propertyErrors[propertyName];
else
return null;
}
private void RaiseErrorsChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}
private void ValidateEstimateTime()
{
ClearErrors(nameof(EstimateTime));
if (EstimateTime < 1)
AddError(nameof(EstimateTime), "The Estimate Time cannot be less than 1.");
if (EstimateTime > 800)
AddError(nameof(EstimateTime), "The Estimate Time cannot be greater than 800");
}
private void AddError(string propertyName, string error)
{
if (!propertyErrors.ContainsKey(propertyName))
propertyErrors[propertyName] = new List<string>();
if (!propertyErrors[propertyName].Contains(error))
{
propertyErrors[propertyName].Add(error);
RaiseErrorsChanged(propertyName);
}
}
private void ClearErrors(string propertyName)
{
if (propertyErrors.ContainsKey(propertyName))
{
propertyErrors.Remove(propertyName);
RaiseErrorsChanged(propertyName);
}
}
public ProjectTask Parent { get; }
public List<ProjectTask> Tasks { get; }
//...
}
Событие "ValidateCellValue" в контроле¶
Событие DataControlBase.ValidateCellValue
позволяет вам реализовать логику валидации пользовательских значений.
Инициирование события DataControlBase.ValidateCellValue
является необязательным этапом механизма валидации, вызываемого после того, как пользователь изменил значение ячейки.
Механизм валидации также используется для проверки достоверности вновь отображаемых ячеек и ячеек, обновленных в коде. В этом случае событие DataControlBase.ValidateCellValue
срабатывает только в том случае, если унаследованным свойством DataControlBase.ValidateCellValuesOnShowAndUpdate
является true
(значение по умолчанию - false
).
Пример¶
Следующий пример обрабатывает событие ValidateCellValue
, чтобы показывать ошибки, когда значение свойства Date1 больше значения свойства Date2.
public partial class Department : ObservableObject, IDataErrorInfo
{
[ObservableProperty]
public DateTime date1 = new DateTime();
[ObservableProperty]
public DateTime date2 = new DateTime();
}
treeList1.ValidateCellValue += TreeList1_ValidateCellValue;
// Uncomment the following code line to use the ValidateCellValue event handler
// to check cells when they are displayed or modified in code:
// treeList1.ValidateCellValuesOnShowAndUpdate = true;
private void TreeList1_ValidateCellValue(object? sender, TreeListValidateCellValueEventArgs e)
{
Department dep = e.Node.Content as Department;
if(e.Column.FieldName == "Date1")
{
DateTime value1 = Convert.ToDateTime(e.Value);
DateTime value2 = dep.Date2;
if(value1 > value2)
{
e.ErrorContent = "Date1 must be less than Date2";
return;
}
}
}
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.