Edu*_*tes 4 validation wpf wpfdatagrid
我有一个名为UniqueNameSolidWoodRule的精简版ValidationRule来验证数据网格中的重复条目.
这是代码:
public class UniqueNameSolidWoodRule : ValidationRule
{
public CollectionViewSource CurrentCollection { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value != null)
{
ObservableCollection<SolidWood_VM> castedCollection = (ObservableCollection<SolidWood_VM>)CurrentCollection.Source;
foreach (SolidWood_VM swVM in castedCollection)
{
if (swVM.Designation == value.ToString())
{
return new ValidationResult(false, ResourcesManager.Instance.GetString("DuplicatedRecord"));
}
}
}
return new ValidationResult(true, null);
}
}
Run Code Online (Sandbox Code Playgroud)
这是XAML片段:
<DataGrid.Resources>
<CollectionViewSource x:Key="CurrentSolidWoodCollection" Source="{Binding Path=SolidWoods}" />
</DataGrid.Resources>
<DataGridTextColumn x:Name="Column2" Header="{x:Static p:Resources.Designation}" Width="auto">
<DataGridTextColumn.Binding>
<Binding Path="Designation" ValidatesOnDataErrors="True" UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<my:UniqueNameSolidWoodRule CurrentCollection="{StaticResource CurrentSolidWoodCollection}"/>
</Binding.ValidationRules>
</Binding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)
我的问题是,有时这个规则会将值与自己的行进行比较.我怎么能阻止这个?在我看来,我需要一个与要比较的值相关联的row.index属性,但不幸的是我无法找到实现这一目标的方法.
Edu*_*tes 12
我终于把事情搞定了!
这是解决方案:
在XAML中,我添加了以下ValidationStep:
<my:UniqueNameSolidWoodRule CurrentCollection="{StaticResource CurrentSolidWoodCollection}" ValidationStep="CommittedValue"/>
Run Code Online (Sandbox Code Playgroud)
这样我得到一个BindingExpression对象而不是字符串作为重写的Validate方法的第一个参数,这给了我更多关于要验证的记录的信息,就像我可以用来检查我是否正在比较同一个对象的HashCode一样.
这是更新的Validate方法:
public class UniqueNameSolidWoodRule : ValidationRule
{
public CollectionViewSource CurrentCollection { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value != null)
{
ObservableCollection<SolidWood_VM> castedCollection = (ObservableCollection<SolidWood_VM>)CurrentCollection.Source;
SolidWood_VM curValue = (SolidWood_VM)((BindingExpression)value).DataItem;
foreach (SolidWood_VM swVM in castedCollection)
{
if (curValue.GetHashCode() != swVM.GetHashCode() && swVM.Designation == curValue.Designation.ToString())
{
return new ValidationResult(false, ResourcesManager.Instance.GetString("DuplicatedRecord"));
}
}
}
return new ValidationResult(true, null);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8206 次 |
| 最近记录: |