我需要检查OfferModel类的所有属性。
问题是您需要检查:Picture、Descriptions、Param因为它们是集合而不是属性。
例如:如何检查 Descriptions.Text 集合的属性是否为空(即用户输入数据,一切正常,如果不是这样,文本框变为红色,我用 IDataErrorInfo做)并检查集合有元素 Descriptions.Count()>0 然后按钮被禁用。
也就是说,如果集合中的 Descriptions.Count()>0 超过 0 个元素,并且如果元素都是空的空激活按钮。
我用这个例子来检查数据验证。我有集合模型,但我不知道如何检查数据验证。
报价模型
class OfferModel:ChangeProperty,IDataErrorInfo
{
#region Cвойства
string url { get; set; }
public string Url
{
get { return url; }
set
{
url = value;
OnPropertyChanged("Url");
}
}
decimal price { get; set; }
public decimal Price
{
get { return price; }
set
{
price = value;
OnPropertyChanged("Price");
}
}
string currencyId { get; set; }
public string CurrencyId
{
get { return currencyId; }
set
{
currencyId = value;
OnPropertyChanged("CurrencyId");
}
}
int categoryId { get; set; }
public int CategoryId
{
get { return categoryId; }
set
{
categoryId = value;
OnPropertyChanged("CategoryId");
}
}
public ObservableCollection<string> Picture { get; set; } = new ObservableCollection<string>();
string name { get; set; }
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged("Name");
}
}
string vendor { get; set; }
public string Vendor
{
get { return vendor; }
set
{
vendor = value;
OnPropertyChanged("Vendor");
}
}
public ObservableCollection<DescriptionModel> Descriptions { get; set; } = new ObservableCollection<DescriptionModel>();
public ObservableCollection<ParamModel> Param { get; set; } = new ObservableCollection<ParamModel>();
int stock_quantity { get; set; }
public int Stock_quantity
{
get { return stock_quantity; }
set
{
stock_quantity = value;
OnPropertyChanged("Stock_quantity");
}
}
bool аvailable { get; set; }
public bool Available
{
get { return аvailable; }
set
{
аvailable = value;
OnPropertyChanged("Available");
}
}
int id { get; set; }
public int Id
{
get { return id; }
set
{
id = value;
OnPropertyChanged("Id");
}
}
#endregion
#region Проверка свойств
string er { get; set; }
public string Error
{
get { return er; }
}
public string this[string propertyName]
{
get
{
string validationResult = null;
switch (propertyName)
{
case "Name":
validationResult = Validation.Name(Name);
break;
case "Url":
validationResult = Validation.Ui(Url);
break;
case "Price":
validationResult = Validation.Price(Price);
break;
case "Vendor":
validationResult = Validation.Vendor(Vendor);
break;
case "Stock_quantity":
validationResult = Validation.StockQuantity(Stock_quantity);
break;
default:throw new ApplicationException("Неизвестное свойство проверяется модели OfferModel.");
}
return validationResult;
}
}
#endregion
public OfferModel(){}
public OfferModel(string url, decimal price, string currencyId, int categoryId, string name, string vendor, int stock_quantity, bool available, int id)
{
Url = url;
Price = price;
CurrencyId = currencyId;
CategoryId = categoryId;
Name = name;
Vendor = vendor;
Stock_quantity = stock_quantity;
Available = available;
Id = id;
}
}
参数模型
class ParamModel :ChangeProperty,IDataErrorInfo
{
string name { get; set; }
string text { get; set; }
/// <summary>
/// Xарактеристику параметра.
/// </summary>
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged("Name");
}
}
/// <summary>
/// Значение параметра.
/// </summary>
public string Text
{
get { return text; }
set
{
text = value;
OnPropertyChanged("Text");
}
}
public ParamModel() { }
public ParamModel(string name, string text)
{
Name = name;
Text = text;
}
#region Проверка свойств
string er { get; set; }
public string Error
{
get { return er; }
}
public string this[string propertyName]
{
get
{
string validationResult = null;
switch (propertyName)
{
case "Name":
validationResult = Validation.NameParam(Name);
break;
case "Text":
validationResult = Validation.TextParam(Text);
break;
default:throw new ApplicationException("Неизвестное свойство проверяется модели ParamModel.");
}
return validationResult;
}
}
#endregion
}
描述型号
class DescriptionModel:ChangeProperty,IDataErrorInfo
{
private string text { get; set; }
public string Text
{
get { return text; }
set
{
text = value;
OnPropertyChanged(nameof(Text));
}
}
public DescriptionModel() { }
public DescriptionModel(string text)
{
Text = text;
}
#region Проверка свойств
string er { get; set; }
public string Error
{
get { return er; }
}
public string this[string propertyName]
{
get
{
string validationResult = null;
switch (propertyName)
{
case "Text":
validationResult = Validation.Text(Text);
break;
default: throw new ApplicationException("Неизвестное свойство проверяется модели DescriptionModel.");
}
return validationResult;
}
}
#endregion
}
添加产品时如何检查集合的 AddProductViewModel属性:Picture.CollectionChanged - 添加到集合时,item.PropertyChanged - 属性更改时。
这在触发 CollectionChanged 事件时很好(也就是说,当添加到集合时,如果通过引用将报价传递给用于测量产品的构造函数,则 CollectionChanged 事件将不起作用)。
还有另一种实现验证的方法吗?
readonly OfferModel offer;
/// <summary>
/// Хранения валлидность свойств.
/// </summary>
private Dictionary<string, bool> validProperties;
/// <summary>
/// Включить кнопку если все свойства валлидни.
/// </summary>
private bool allPropertiesValid = false;
public bool AllPropertiesValid
{
get { return allPropertiesValid; }
set
{
if (allPropertiesValid != value)
{
allPropertiesValid = value;
OnPropertyChanged("AllPropertiesValid");
}
}
}
#region Валидации данных
validProperties = new Dictionary<string, bool>();//нужен для того чтобы включить кнопку добавленные если все данные будут коректные.
validProperties.Add("Name", false);
validProperties.Add("Url", false);
validProperties.Add("Price", false);
validProperties.Add("Vendor", false);
validProperties.Add("Stock_quantity", false);
validProperties.Add("Picture", false);
validProperties.Add("Descriptions", false);
validProperties.Add("Param", false);
//Проверки на валидность ввода Picture Descriptions Param.
Picture.CollectionChanged += (s, e) =>
{
validProperties["Picture"] = Picture.Count() > 0 ? true : false;
ValidateProperties();
};
Descriptions.CollectionChanged += (s, e) =>
{
bool isEmpty = false;
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (DescriptionModel item in e.NewItems)//Добавление новые элементы
{
isEmpty = Validation.TextBool(item.Text) ? false : true;
item.PropertyChanged += (sender, argument) => //Проходимся по свойствам модели.
{
int i = 0;
foreach (var des in Descriptions)
{
if (Validation.TextBool(des.Text))
{
i++;
}
}
validProperties["Descriptions"] = (i == 0) ? true : false;
isEmpty = (i == 0) ? true : false;
ValidateProperties();
};
}
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
int i = 0;
foreach (var des in Descriptions)
{
if (Validation.TextBool(des.Text))
{
i++;
}
}
isEmpty = (i == 0) ? true : false;
}
validProperties["Descriptions"] = (Descriptions.Count > 0 && isEmpty != false) ? true : false;
ValidateProperties();
};
Param.CollectionChanged += (s, e) =>
{
bool isEmpty = false;
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (ParamModel item in e.NewItems)//Добавление новые элементы
{
var name = Validation.NameBoolParam(item.Name);
var text = Validation.TextBoolParam(item.Text);
validProperties["Param"] = (name && text) ? false: true;
item.PropertyChanged += (sender, argument) => //Проходимся по свойствам модели.
{
int nameisvalid = 0;
int textisvalid = 0;
foreach (var par in Param)//Ищем неправильно заполнены параметры.
{
if (Validation.NameBoolParam(par.Name)) nameisvalid++;
if (Validation.TextBoolParam(par.Text)) textisvalid++;
}
validProperties["Param"] = (nameisvalid == 0 && textisvalid == 0) ? true : false;
isEmpty = (nameisvalid == 0 && textisvalid == 0) ? true : false;
ValidateProperties();
};
}
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
int nameisvalid = 0;
int textisvalid = 0;
foreach (var par in Param)
{
if (Validation.NameBoolParam(par.Name)) nameisvalid++;
if (Validation.TextBoolParam(par.Text)) textisvalid++;
}
isEmpty = (nameisvalid == 0 && textisvalid == 0) ? true : false;
}
validProperties["Param"] = (Param.Count > 0 && isEmpty != false) ? true : false;
ValidateProperties();
};
#endregion
#region Реализация IDataErrorInfo
public string Error
{
get { return (offer as IDataErrorInfo).Error; }
}
public string this[string propertyName]
{
get
{ if(offer != null)
{
string error = (offer as IDataErrorInfo)[propertyName];
validProperties[propertyName] = string.IsNullOrEmpty(error) ? true : false;
ValidateProperties();
CommandManager.InvalidateRequerySuggested();
return error;
}
return null;
}
}
private void ValidateProperties()
{
foreach (bool isValid in validProperties.Values)
{
if (!isValid)
{
AllPropertiesValid = false;
return;
}
}
AllPropertiesValid = true;
}
#endregion
有用于此目的的ValidationAttribute属性。如果您需要实施任何特殊的属性检查,您可以:
之后,我们可以使用反射来检查。用法可能如下所示:
验证属性实现示例:
相关链接
P.S.: извиняюсь. Только сейчас понял, что речь идёт о WPF. В таком случае вот этот ответ поможет.