主键字段的 WPF 行验证

本文关键字:验证 WPF 字段 | 更新日期: 2023-09-27 18:36:50

我已经研究了这个话题几个小时,但找不到适合我的解决方案。

我有一个简单的 WPF 程序,它使用数据网格来显示代码中的对象列表(与 msdn 演示的方式非常相似)

我的数据取自 SQL 数据库,并放入绑定到数据网格的对象列表中,如下所示:

public PersonInfo()
{
    InitialiseComponent();
    LoadPeopleFromSQL();
}
public void LoadPeopleFromSQL()
{
    DataSet ds = GetDataSet(SQLConnectionString);
    List<PersonInfo> personList = new List<PersonInfo>();
    foreach(DataRow row in ds.Tables[0].Rows)
    {
        personList.Add(new PersonInfo(row[0], row[1], row[2]));
    }
PersonDataGrid.ItemsSource = personList;

我已经设置了一个 ValidationRule 类,其中包含一个与结构 msdn 示例完全匹配的公共覆盖 ValidationResult Validate() 方法:http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.rowvalidationrules%28v=vs.110%29.aspx(除了它使用我的"人"对象而不是"课程"对象)

public class CourseValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value,
        System.Globalization.CultureInfo cultureInfo)
    {
        Course course = (value as BindingGroup).Items[0] as Course;
        if (course.StartDate > course.EndDate)
        {
            return new ValidationResult(false,
                "Start Date must be earlier than End Date.");
        }
        else
        {
            return ValidationResult.ValidResult;
        }
    }
}
//Xaml snippet
<DataGrid.RowValidationRules>
  <local:CourseValidationRule ValidationStep="UpdatedValue"/>
</DataGrid.RowValidationRules>

但是,我现在要做的是搜索数据网格中的其余项目,并检查以确保 PersonInfo.ID 字段没有重复。我找到了这个代码:http://www.codeproject.com/Articles/30905/WPF-DataGrid-Practical -Examples#valid_dataset

但此示例要求 BindingGroup 对象返回数据行,而不是类对象。

我注意到 BindingGroup 对象有一个名为"所有者"的属性,该属性似乎包含数据行。但是,我使用的是 .net 4,无法访问"所有者"属性。

请有人告诉我如何验证我的主键吗?或者帮助我从 .net 4 中访问 BindingGroup.Owner 属性(我相信这会解决我的问题)

主键字段的 WPF 行验证

这里的问题是将我的完整"人员"列表从我的主要工作类转移到 DataRowValidation 类。

由于我找不到绑定到 DataRow 对象的方法,我在 DataRowValidation 类中放置了一个公共属性,并用主类中的当前人员列表填充它:

public class DataRowValidation : ValidationRule
{
    public List<PersonInfo> People {get; set;}
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        if (value is BindingGroup)
        {
            BindingGroup group = (BindingGroup)value;
            People = PersonClass.personList;
            //Code to loop through list and test for duplicates
        }
     }
}