gpt4 book ai didi

唯一字段的 Wpf 数据网格验证规则

转载 作者:行者123 更新时间:2023-12-04 15:24:35 26 4
gpt4 key购买 nike

我有一个名为 UniqueNameSolidWoodRule 的子类验证规则来验证数据网格中的重复条目。

这是代码:

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);
}
}

这是 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>

我的问题是 有时 这条规则将值与其自己的行进行比较。我怎么能防止这种情况?在我看来,我需要一个与要比较的值关联的 row.index 属性,但不幸的是,我无法找到实现这一目标的方法。

最佳答案

我终于开始工作了!

这是解决方案:

在 XAML 中,我添加了以下 ValidationStep:

<my:UniqueNameSolidWoodRule CurrentCollection="{StaticResource CurrentSolidWoodCollection}" ValidationStep="CommittedValue"/>

这样我得到一个 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);
}
}

关于唯一字段的 Wpf 数据网格验证规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10548357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com