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;
    }
}

問題は、テキスト ボックスが空でないデータにバインドされている場合でも、起動時に赤い検証エラーの境界線が表示されることです。

検証ルールのブレークポイントを見ると、(バインディングが有効なデータに変更される前に) 空の文字列に対して 1 回呼び出され、バインディングが有効なデータに更新された後にもう一度呼び出されることがわかります。案の定、2 番目の呼び出しは ValidResult を返しますが、赤い境界線は残っています。

テキストボックスを手動でクリアして新しいテキストを入力すると、赤い境界線がクリアされますが、最初にクリアせずに新しいテキストを入力するだけではクリアされません。

他の人々の質問を読むことから、私が見ることができる1つの潜在的なトリッキーは、このTextBoxがタブコントロールにあるということです。ただし、私の問題は他の人々の反対であり (検証に失敗したにもかかわらず赤い境界線が表示されませんでした)、別のタブ コントロールに移動することもありません (これが他の問題の原因でした)。

私がここで見逃しているアイデアはありますか?

4

2 に答える 2

2

WindowのLoadedイベント中に検証済みのバインドされたデータを変更すると、問題が発生したことがわかりました。私の場合、問題は、代わりにInitializedまたはContentRendered中にデータ変更を実行することで解決されました。Initializedには、最初の(無効な)バインディングの前に発生するという利点があります。これにより、アプリの読み込み中に一時的な赤い境界線が点滅するのを回避できます。

于 2013-01-04T05:54:28.273 に答える
0

私はあなたの問題を再現しようとしましたが、私のテストではvalidationRuleうまくいくようです.

テーブルはあなたのバインディングTwoWayですか?

私のテスト:

xaml:

<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 に答える