WPF中ListBox上的数据验证

时间:2010-12-13 15:46:11

标签: wpf validation

我有一个ListBox绑定到类型为T的ObservableCollection - 每个ListBoxItem是一个复选框,其中IsChecked绑定到T中的bool属性。我想验证ListBox中的已检查项目,以便至少必须勾选一个复选框 - 如果没有勾选复选框,我想在ListBox周围显示一个红色边框(标准验证通知)。

我该怎么做呢?我可以使用ValidatesOnDataErrors吗?

2 个答案:

答案 0 :(得分:1)

在公开IDataErrorInfo属性的类中实现ObservableCollection<T>,如果集合中的所有对象的值都为false,则使索引器返回该属性名称的错误他们的布尔属性。然后使用绑定DataErrorValidationRule中的ValidationRules

答案 1 :(得分:0)

您的目标是验证ListBox的所选项目:至少需要一个所选项目。首先,有不同的方法来处理选择本身:

a)您可以通过ListBox使用ListBox.SelectedItem选择机制。 我想,你可以将绑定指定为SelectedItem="{Binding SelectedThing, ValidatesOnNotifyDataErrors=True}"和WPF的常规验证工作。不确定,如果这适用于多选。

b)您可以使用ListBox.SelectedItems。绑定是不可能的,需要通过事件处理程序后面的代码伪造。因此,WPF的验证无法在此处触发。

c)您对每个项目使用自己的IsSelected属性(或类似),要么通过CheckBox明确地绑定到您的viewmodel,要么通过ListBoxItem.IsSelected隐含地绑定到您的viewmodel(通过ListBox.ItemContainerStyle)。

从这里,您可以在viewmodel中创建一个bool IsValidSelection属性,只要选择发生更改,该属性就会更新。或者,您可以对viewmodel的任何结果属性运行验证规则(例如SelectedItems)。但是,您无法验证绑定的ListBox.ItemSource本身!因此,WPF的标准机制不起作用(列表框没有红色边框或其他)。

变通方法

您可以通过显示不可见的Label并将其可见性与上述bool IsValidSelection属性绑定来明确地创建错误通知。这是一种非常明确的方式,根本不使用WPF验证。

您可以修改INotifyDataErrorInfo(或类似)实现,以触发其他属性名称上的错误。如果您使用通用ValidatableViewModel<T>(像我一样),这是不可能的。我想这是另一个答案的意图。