主键字段的 WPF 行验证
WPF Row Validation for Primary Key Field
我已经研究这个主题几个小时了,但找不到适合我的解决方案。
我有一个简单的 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 class,其中包含 public 覆盖 ValidationResult Validate() 方法,完全 匹配结构 msdn 示例:http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.rowvalidationrules%28v=vs.110%29.aspx
(除了它使用我的 'Person' 对象而不是 'Course' 对象)
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 对象是 return 数据行,而不是 class 对象。
我注意到 BindingGroup 对象有一个名为 'Owner' 的 属性,它似乎包含一个数据行。但是我使用的是 .net 4,无法访问 'Owner' 属性.
有人可以告诉我如何验证我的主键吗?或者帮助我从 .net 4 中访问 BindingGroup.Owner 属性(我相信这会解决我的问题)
这里的问题是将我的 'People' 的完整列表从我的主要工作 class 转移到 DataRowValidation class。
由于找不到绑定到 DataRow 对象的方法,我在 DataRowValidation class 中放置了一个 public 属性 并用当前的人员列表填充它来自我的主要 class:
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
}
}
}
我已经研究这个主题几个小时了,但找不到适合我的解决方案。
我有一个简单的 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 class,其中包含 public 覆盖 ValidationResult Validate() 方法,完全 匹配结构 msdn 示例:http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.rowvalidationrules%28v=vs.110%29.aspx (除了它使用我的 'Person' 对象而不是 'Course' 对象)
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 对象是 return 数据行,而不是 class 对象。
我注意到 BindingGroup 对象有一个名为 'Owner' 的 属性,它似乎包含一个数据行。但是我使用的是 .net 4,无法访问 'Owner' 属性.
有人可以告诉我如何验证我的主键吗?或者帮助我从 .net 4 中访问 BindingGroup.Owner 属性(我相信这会解决我的问题)
这里的问题是将我的 'People' 的完整列表从我的主要工作 class 转移到 DataRowValidation class。
由于找不到绑定到 DataRow 对象的方法,我在 DataRowValidation class 中放置了一个 public 属性 并用当前的人员列表填充它来自我的主要 class:
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
}
}
}