我正在从DataBase中读取DataBase列,并为每个列生成一个TextBox。
现在我想添加不同的ValidationRules。例如,对于必填字段的ValidationRule,例如,如果AllowDBNull
为false,则该字段是必需的,我需要添加ValidationRule。
ValidationRule如下:
public class NotEmptyValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
return string.IsNullOrWhiteSpace((value ?? "").ToString())
? new ValidationResult(false, "Field is required.")
: ValidationResult.ValidResult;
}
}
然后我循环通过DataTable schmeaTable
填充schemaTable = dataReader.GetSchemaTable();
。对于表格中的每一行,我将ColumnName
,DataType
,ColumnSize (Length)
和AllowDBNull
属性保存到变量中。
对于DataBase中NOT NULL
的每一行,我为ValidationRule创建一个绑定。
foreach (DataRow row in schemaTable.Rows)
{
bool AllowDBNull = row.Field<Boolean>("AllowDBNull");
TextBox textBox = new TextBox();
textBox.Name = row["ColumnName"].ToString();
if(!AllowDBNull)
{
Binding binding = new Binding();
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
binding.ValidatesOnDataErrors = true;
binding.NotifyOnValidationError = true;
binding.ValidationRules.Add(new NotEmptyValidationRule());
// binding.Path = ???
textBox.SetBinding(TextBox.TextProperty, binding);
}
}
但我还需要设置我无法创建的属性的路径,因为我永远不知道我将拥有哪些属性。
我可以在DataBase中有5个不同名称的列,或者我可以使用不同名称的10列或更多/更少。
我的ViewModel仅包含PropertyChanged事件:
public class TextFieldViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private Action<PropertyChangedEventArgs> RaisePropertyChanged()
{
return args => PropertyChanged?.Invoke(this, args);
}
}
那么如何将Binding.Path
设置为必须在我创建TextBox的foreach loop
中动态生成的属性?