WPF TextBox单独验证源

时间:2010-07-09 13:02:30

标签: c# wpf data-binding validation

我正在尝试找到一个解决方案,让TextBox显示并验证来自两个不同来源的数据,如下面的小例子所示:

<TextBox Text="{Binding Port.Name}" 
ValidationSource="{Binding Ship.PortFK}"/>

这里Ship数据对象包含一个充当端口外键的属性,该属性有自己的验证器。

我已经探索了下面链接的ValidationRules的使用,但这只给了我PortFK的值,而我需要带有验证属性的属性。

http://michlg.wordpress.com/2010/01/29/wpf-custom-validationrule-with-an-additional-parameter/

有没有人知道这方面的解决方案?

- 编辑 -

我看到我没有充分解释我的问题;)。

实际上ValidationSource标记不存在于.Net或我自己的程序中,因为我不知道如何创建这样一种绑定到属性的构造,使用其验证属性验证属性并以某种方式提供验证信息到TextBox的验证结构。

进一步详细说明数据对象:

public class Port
{
    public int PortPK { get; set; }

    [StringLengthValidator]
    public string Name { get; set; }

    ...
}

public class Ship
{
    [NotNullValidator]
    public int PortFK { get; set; }

    ...
}

因此TextBox.Text绑定应显示Port.Name而不验证它。验证应在Ship.PortFK上完成,它将显示是否已将一个端口设置为发货。

- 编辑2 -

表单是用于编辑Ship数据的CRUD表单。 文本框是选择器控件的一部分,该控件由显示Port.Name的TextBox和用于选择特定端口的按钮组成。

验证应指明是否已为船舶选择了港口。为此,在Ship.PortFK上使用NotNullValidator,如果尚未设置PortFK值,则触发验证器并警告用户选择端口。

因此,用户可以为Ship选择特定端口,之后TextBox将显示Port.Name。 由于数据模型定义了船舶必须使用港口,因此TextBox的验证应向用户显示是否尚未为该船舶选择港口。

1 个答案:

答案 0 :(得分:0)

你能使用MultiBinding吗? MultiBinding允许您将多个值转换为单个值。

<TextBox.ValidationSource>
  <MultiBinding Converter="{StaticResource multiValueConverter}">
    <Binding Path="Ship.Prop1" />
    <Binding Path="Ship.Prop2" />
  </MultiBinding>
</TextBox.ValidationSource>

上面,Ship的两个属性被传递给名为multiValueConverter的IMultiValueConverter(您需要实现自己的转换器)。

你的IMultiValueConverter实现应该将这两个属性的值转换为一个值,这个值可以被你绑定的任何东西所消耗 - 据我所知,没有解决这个问题 - 但是这个值可能是一个对象[]。

如果这没有帮助,也许您可​​以向我们提供更多源代码以及您绑定的对象的结构?