我有一个ListBox,它绑定了一个类型为T的ObservableCollection - 每个ListBoxItem都是一个复选框,其IsChecked属性绑定到T中的一个bool属性。我想要验证ListBox中被选中的项,以确保至少有一个复选框被选中 - 如果没有任何复选框被选中,我想在ListBox周围显示红色边框(标准验证通知)。
我该如何做呢?我可以使用ValidatesOnDataErrors吗?
我有一个ListBox,它绑定了一个类型为T的ObservableCollection - 每个ListBoxItem都是一个复选框,其IsChecked属性绑定到T中的一个bool属性。我想要验证ListBox中被选中的项,以确保至少有一个复选框被选中 - 如果没有任何复选框被选中,我想在ListBox周围显示红色边框(标准验证通知)。
我该如何做呢?我可以使用ValidatesOnDataErrors吗?
ObservableCollection<T>
属性的类中实现 IDataErrorInfo
,并使索引器返回该属性名称的错误,如果集合中的所有对象在其布尔属性中具有 false
的值。然后在绑定的 ValidationRules
中使用 DataErrorValidationRule
。您的目标是验证 ListBox
中选择的项目:至少需要选择一个项目。首先,有不同的方法来处理选择本身:
a) 您可以使用 ListBox.SelectedItem
机制进行选择。
我猜想,您可以将绑定指定为 SelectedItem="{Binding SelectedThing, ValidatesOnNotifyDataErrors=True}"
,然后 WPF 的常规验证就会起作用。不确定这是否适用于多选。
b) 您可以使用 ListBox.SelectedItems
。无法进行绑定,需要通过代码后台事件处理程序进行伪造。因此,WPF 的验证无法在此处触发。
c) 您可以使用自己的每个项目的 IsSelected
属性(或类似属性),可以通过 CheckBox
显式地绑定到您的视图模型,也可以通过 ListBoxItem.IsSelected
隐式地绑定(通过 ListBox.ItemContainerStyle
)。
从这里开始,您可以在视图模型中创建一个bool IsValidSelection
属性,每当选择更改时更新它。或者您可以对视图模型的任何结果属性(例如SelectedItems
)运行验证规则。但是,您不会验证绑定的ListBox.ItemSource
本身!因此,WPF的标准机制无法工作(列表框不会变成红色边框或其他什么)。
您可以通过显示一个否则不可见的Label
并将其可见性绑定到上述bool IsValidSelection
属性来显式创建错误通知。这是一种非常明确的方式,根本不使用WPF验证。
您可以修改您的INotifyDataErrorInfo
(或类似)实现,以触发不同属性名称上的错误。如果您使用通用的ValidatableViewModel<T>
(像我一样),则无法实现此操作。我想这就是其他答案的意图。