Jos*_*osh 8 .net c# validation wpf gridview
这可能是预期的功能,但它确实对我来说似乎是个错误.
我正在使用开箱即用的WPF DataGrid,绑定到ObservableCollection并尝试使用一些验证规则以提供良好的用户反馈.毋庸置疑,还有比我更重要的问题,但我会坚持立即.
以下是问题的摘要:
ItemsSource财产绑定到ObservableCollection<T>ObservableCollection<T>执行这些步骤后,GridView会正确识别该项目已从集合中删除,并从网格中删除该行.但是,Grid现在处于无效状态,并且无法通过Grid上的UI执行进一步的操作!
再次,这似乎是一个很大的错误,因为能够以编程方式从集合中删除项目是一件大事.
有没有人碰到这个?有关如何绕过它的任何建议吗?
值得注意的是,我已经创建了一个单独的解决方案来解决这个问题,但是要回答一些问题:
你的对象实现了INotifyPropertyChanged吗? 是
这是一个自定义集合吗? 没有普通的老ObservableCollection<T>
你是如何从收藏品中删除物品的?
//Find any newly added item and remove it
var someObject = SomeObjects
.Where(obj => obj.SomeProperty == SomeValue)
.First();
SomeObjects.Remove(someObject );
Run Code Online (Sandbox Code Playgroud)
你如何绑定验证规则?
<DataGridTextColumn Header="SomeProperty">
<DataGridTextColumn.Binding>
<Binding Path="SomeProperty">
<Binding.ValidationRules>
<val:RequiredValidator ValidationStep="ConvertedProposedValue"
ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)
您的验证规则是什么样的?
public class RequiredValidator : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null || String.IsNullOrWhiteSpace(value as String))
return new ValidationResult(false, "Field is required!");
return ValidationResult.ValidResult;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有兴趣,我有一个非解决方案:
我们发现整个验证机制充满了不需要的行为。例如 - 我们希望允许用户输入无效数据,并且只标记错误。
为此,我们创建了一个带有红框的单元格模板,该模板与数据触发器绑定,每当给定属性的错误状态发生变化时就会调用该触发器。数据触发器的实际创建是通过依赖属性完成的,该属性接收 ViewModel 属性的绑定路径并创建绑定
IE:
DataTrigger errorTrigger = CreateTrigger(CreateDirectBinding(property,new HasErrorValueConverter()), CreateErrorSetter(property));
Run Code Online (Sandbox Code Playgroud)
这可以解决与验证错误相关的问题。