gpt4 book ai didi

wpf - 当其中任何一个属性发生更改时,如何验证多个属性?

转载 作者:行者123 更新时间:2023-12-02 01:23:39 25 4
gpt4 key购买 nike

我有两个日期字段:开始日期和结束日期。开始日期必须早于结束日期。

如果用户将 StartDate 更改为大于 EndDate,则该 DatePicker 周围会出现红色边框,反之亦然。如果用户更改第二个框以使日期范围现在正确,则第一个框仍然存在验证错误。

当其中一个日期字段发生更改时,如何验证这两个日期字段?

enter image description here

我正在使用IDataErrorInfo

public string GetValidationError(string propertyName)
{
switch (propertyName)
{
case "StartDate":
if (StartDate > EndDate)
s = "Start Date cannot be later than End Date";
break;

case "EndDate":
if (StartDate > EndDate)
s = "End Date cannot be earlier than Start Date";
break;
}

return s;
}

我不能简单地引发 PropertyChange 事件,因为我需要在两个字段中的任何一个发生更改时验证这两个字段,因此让它们都为另一个字段引发 PropertyChange 事件将陷入无限循环。

我也不喜欢在其他日期返回验证错误时清除日期字段的想法。

最佳答案

最简单的方法是在 setter 中为需要验证的两个属性发出 PropertyChanged 通知,如 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");
}
}
}

但是,如果这对您不起作用,我想出了一种方法来一起验证一组属性,尽管您的类除了 INotifyPropertyChanged 之外还必须实现 INotifyPropertyChanging >(我正在使用 EntityFramework,默认情况下它们的类实现这两个接口(interface))

扩展方法

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 个属性对此进行了测试,它似乎工作正常。

关于wpf - 当其中任何一个属性发生更改时,如何验证多个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7121867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com