[英]WPF DataGrid Validation Bug?
这可能是预期的功能,但对我来说似乎确实是个错误。
我使用的是现成的WPF DataGrid,绑定到ObservableCollection,并尝试使用一些验证规则以提供良好的用户反馈。 毋庸置疑,还有更多的问题我无法指望,但我会坚持当下。
这是问题的摘要:
ItemsSource
属性绑定到ObservableCollection<T>
ObservableCollection<T>
删除该项目 执行这些步骤后,GridView会正确识别该项目已从集合中删除,并从网格中删除该行。 但是, 网格现在陷入了无效状态,无法通过网格上的UI执行进一步的操作!
同样,对于我来说,这似乎是一个主要错误,因为能够以编程方式从集合中删除项目非常重要。
有人碰到这个吗? 关于如何解决它的任何建议?
值得注意的是,我创建了一个单独的解决方案只是为了隔离此问题,但为了回答您可能遇到的一些问题:
您的对象是否实现INotifyPropertyChanged
? 是
这是自定义收藏吗? 没有普通的旧ObservableCollection<T>
您如何从收藏夹中删除物品?
//Find any newly added item and remove it
var someObject = SomeObjects
.Where(obj => obj.SomeProperty == SomeValue)
.First();
SomeObjects.Remove(someObject );
您如何绑定验证规则?
<DataGridTextColumn Header="SomeProperty">
<DataGridTextColumn.Binding>
<Binding Path="SomeProperty">
<Binding.ValidationRules>
<val:RequiredValidator ValidationStep="ConvertedProposedValue"
ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
您的验证规则是什么样的?
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;
}
}
我花了几个小时试图找出正在发生的事情。 最后,对Items进行简单的刷新即可解决该问题。 希望这可以帮助。
YourDataGrid.Items.Refresh();
我遇到了同样的问题,经过漫长的搜索过程,我找到了解决方案:
您可以创建一个从DataGrid派生的类。 您可以在那里通过反射访问私有属性。 如果现在删除无效的项目,则可以调用函数SetGridWritable(),其他值可以再次编辑。
public class MyDataGrid : DataGrid
{
public void SetGridWritable()
{
BindingFlags bindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Instance;
PropertyInfo cellErrorInfo = this.GetType().BaseType.GetProperty("HasCellValidationError", bindingFlags);
PropertyInfo rowErrorInfo = this.GetType().BaseType.GetProperty("HasRowValidationError", bindingFlags);
cellErrorInfo.SetValue(this, false, null);
rowErrorInfo.SetValue(this, false, null);
}
}
如果您有兴趣,我有一个非解决方案:
我们发现整个验证机制充满了不良行为。 例如-我们想允许我们的用户输入无效的数据,并且仅标记错误。
为此,我们创建了一个带有红色边框的单元格模板,该模板与数据触发器绑定,只要给定属性的错误状态发生更改,就会触发该触发器。 数据触发的实际创建是通过依赖项属性完成的,该依赖项属性接收到ViewModel属性的绑定路径并创建绑定
即:
DataTrigger errorTrigger = CreateTrigger(CreateDirectBinding(property,new HasErrorValueConverter()), CreateErrorSetter(property));
这可以解决与验证错误相关的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.