【问题标题】:Data validation on a ListBox in WPFWPF 中 ListBox 上的数据验证
【发布时间】:2010-12-13 15:46:10
【问题描述】:

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

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

【问题讨论】:

    标签: wpf validation


    【解决方案1】:

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

    【讨论】:

    • 我不确定你的意思。 IDataErrorInfo 索引器永远不会被 ObservableCollection 属性调用,因为它没有改变,只有 T 中的值改变
    • 呃。当属性变为有效或无效时,您必须连接一些东西来提高PropertyChanged。这就有点麻烦了。我会让集合的包含类在集合中的项目上收听PropertyChanged(假设他们提出它;如果他们不这样做,那就更麻烦了),然后重新验证并提出自己的PropertyChanged事件IsChecked 属性(无论其名称如何)在其中一项上发生更改。这有意义吗?
    • 在某种程度上,我已经尝试解决这个问题 2 周了。除了文本框之外,用于验证的信息很少。我决定不打扰内置的验证机制,它太混乱且构思不佳。不过感谢您的意见。
    • 您在做什么,内置验证的哪些方面似乎构思不佳?在我看来,混乱的问题是每当集合中的一个项目发生变化时,都要验证一个集合作为一个整体。
    【解决方案2】:

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

    a) 您可以通过ListBox.SelectedItem 使用ListBox 选择机制。 我想,您可以将绑定指定为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>(像我一样),这是不可能的。我想这是另一个答案的意图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      相关资源
      最近更新 更多