我有一个ListBox绑定到类型为T的ObservableCollection - 每个ListBoxItem是一个复选框,其中IsChecked绑定到T中的bool属性。我想验证ListBox中的已检查项目,以便至少必须勾选一个复选框 - 如果没有勾选复选框,我想在ListBox周围显示一个红色边框(标准验证通知)。
我该怎么做呢?我可以使用ValidatesOnDataErrors吗?
答案 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>
(像我一样),这是不可能的。我想这是另一个答案的意图。