2

我有一个非常简单的 ValidationRule 的文本框:

<TextBox x:Name="textFirstName" Width="120">
    <TextBox.Text>
        <Binding
           Path="CurrentSelectionData.Tables[cpeople].Rows[0][FirstName]"
           UpdateSourceTrigger="PropertyChanged">
           <Binding.ValidationRules>
               <local:NonEmptyStringValidationRule ValidatesOnTargetUpdated="True"/>
           </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

public class NonEmptyStringValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
            return new ValidationResult(false, "Must provide a value.");

        return ValidationResult.ValidResult;
    }
}

问题是即使文本框绑定到非空数据,启动时也会显示红色验证错误边框。

观察验证规则上的断点,我看到它为空字符串调用一次(在绑定更改为有效数据之前),在绑定更新为有效数据之后再次调用。果然,第二次调用返回了ValidResult,但红色边框依然存在。

手动清除文本框并在其中输入新文本会清除红色边框,但只需在其中输入新文本而不先清除它不会。

通过阅读其他人的问题,我可以看到一个潜在的棘手问题,这个 TextBox 位于选项卡控件中。但是,我的问题与其他人相反(尽管验证失败,他们没有得到红色边框),我也没有在任何时候移动到不同的选项卡控件(这是其他问题的原因)。

有什么想法我在这里想念的吗?

4

2 回答 2

2

事实证明,在 Window 的 Loaded 事件期间更改已验证的绑定数据会导致问题。就我而言,问题是通过在 Initialized 或 ContentRendered 期间执行数据更改来解决的。Initialized 的优点是在第一次(无效)绑定之前发生,从而避免在应用加载期间临时出现红色边框。

于 2013-01-04T05:54:28.273 回答
0

我试图复制您的问题,但在我的测试中似乎可以正常工作,因此问题必须与您绑定的数据有关,正如您所说的validationRule工作正常。

表是您的绑定TwoWay吗?

我的测试:

xml:

<TextBox x:Name="textFirstName" Width="120" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}">
    <TextBox.Text>
        <Binding ElementName="UI" Path="TextTest" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" >
            <Binding.ValidationRules>
                <local:NonEmptyStringValidationRule ValidatesOnTargetUpdated="True"  />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private string _textTest;
    public string TextTest
    {
        get { return _textTest ; }
        set { _textTest = value; }
    }
}

public class NonEmptyStringValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        return (value is string && !string.IsNullOrEmpty(value.ToString()))
            ? new ValidationResult(true, null)
            : new ValidationResult(false, "Invalid Text");
    }
}
于 2013-01-04T02:53:15.670 回答