为动态添加的TextBox

时间:2018-03-22 12:29:21

标签: c# wpf

我正在从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();。对于表格中的每一行,我将ColumnNameDataTypeColumnSize (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中动态生成的属性?

0 个答案:

没有答案