【问题标题】:Make ValidationRule also apply to other list object使 ValidationRule 也适用于其他列表对象
【发布时间】:2017-12-08 12:15:14
【问题描述】:

假设我有一个对象 ListCollectionView 并将其绑定到数据网格。我将对象的 Name 属性绑定到 TextBox(数据网格的列之一)的 Text 属性并添加我的特定 ValidationRule。

现在我想通过规则检查Name属性是否重复,我需要检查ListCollectionView中的其他对象,如果有对象的Name属性等于这个Name,则验证结果为false。

我的问题是这个检查只能适用于编辑的对象,所以当它的名称重复时只有这个对象会变成红色,但是我怎样才能对其他列表对象进行检查,使名称属性等于的其他对象这个编辑的也变红了?谢谢。

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    您是正确的,ValidationRule 只能访问它所绑定的数据。但是,您可以编写一个自定义的 ValidationRule - 我有一个 blog post detailing it here,然后您可以向它添加额外的属性,以便您可以注入应该检查您的绑定值的适当数据。

    但是您会遇到一个棘手的问题 - 数据网格中的单元格无法自然访问数据网格的 DataContext,因为数据网格列不在可视树中。为了解决这个问题,您可以使用包含(绑定到)ListCollectionView 的静态代理对象,然后该代理对象可以通过 ValidationRule 绑定(example 1example 2)。

    【讨论】:

    • 谢谢 slugster,一个问题,当我更改 TextBox 的 Text(所以对象的名称也会更改)时,在 TextBox 的 TextChanged 事件处理方法中,我可以通知对象列表,并使每个对象的名称属性得到验证?谢谢。
    • 不,它不是那样工作的,如果你尝试它,你会很快陷入正确的混乱:) 我以前做过 - 你最好的选择是枚举输入控件可视化树,获取这些输入控件的绑定表达式,然后触发可能在绑定表达式上的任何验证规则。这种方法应该谨慎使用——它很慢。但这是唯一真正实用的方法,可以根据所选数据网格单元格的变化使其他数据网格单元格无效。
    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多