30

[保存] ボタンをクリックする前にいくつかのテキスト ボックスを空にすることができないページがあります。

<TextBox...

                <TextBox.Text>
                    <Binding Path ="LastName" UpdateSourceTrigger="PropertyChanged">

                        <Binding.ValidationRules>
                            <local:StringRequiredValidationRule />
                        </Binding.ValidationRules>                              
                    </Binding>
                </TextBox.Text>

私のルールは機能します。値を入力するまで、テキストボックスの周りに赤い境界線が表示されます。この検証ルールを他のテキスト ボックスに追加したいと考えています。

ページに検証エラーがなくなるまで [保存] ボタンを無効にするにはどうすればよいですか? 何を確認すればよいかわかりません。

4

10 に答える 10

19

これがあなたが必要とする完全なサンプルです。

http://codeblitz.wordpress.com/2009/05/08/wpf-validation-made-easy-with-idataerrorinfo/

https://skydrive.live.com/?cid=2c6600f1c1d5e3be&id=2C6600F1C1D5E3BE%21203

ここに画像の説明を入力してください

于 2012-01-23T17:24:16.047 に答える
17

ビューのコード ビハインドでは、Validation.ErrorEvent を次のように接続できます。

this.AddHandler(Validation.ErrorEvent,new RoutedEventHandler(OnErrorEvent)); 

その後

private int errorCount;
private void OnErrorEvent(object sender, RoutedEventArgs e)
{
    var validationEventArgs = e as ValidationErrorEventArgs;
    if (validationEventArgs  == null)
        throw new Exception("Unexpected event args");
    switch(validationEventArgs.Action)
    {
        case ValidationErrorEventAction.Added:
            {
                errorCount++; break;
            }
        case ValidationErrorEventAction.Removed:
            {
                errorCount--; break;
            }
        default:
            {
                throw new Exception("Unknown action");
            }
    }
    Save.IsEnabled = errorCount == 0;
}

これは、削除の通知を受け取ることを前提としています (問題のある要素が無効であるときに削除した場合は通知されません)。

于 2009-04-30T17:44:10.577 に答える
8

Validation.HasError添付プロパティを使用したい。

同じように、Josh Smith はBinding to (Validation.Errors)[0] without Creation Debug Spew に関する興味深い記事を読んでいます。

于 2008-10-24T05:22:40.883 に答える
2

コード ビハインドから HasError コントロール プロパティを確認する必要があるのはこれだけです。

保存ボタンをクリックしてこのコードを実行します

 BindingExpression bexp = this.TextBox1.GetBindingExpression(TextBox.TextProperty);
bexp.UpdateSource(); // this to refresh the binding and see if any error exist 
bool hasError = bexp.HasError;  // this is boolean property indique if there is error 

MessageBox.Show(hasError.ToString());
于 2012-12-25T11:36:08.273 に答える
2

以下は、依存オブジェクト (およびそのすべての子オブジェクト) の検証エラーを追跡し、デリゲートを呼び出して変更を通知するヘルパー メソッドです。また、検証エラーのある子の削除も追跡します。

 public static void AddErrorHandler(DependencyObject element, Action<bool> setHasValidationErrors)
        {
            var errors = new List<Tuple<object, ValidationError>>();

            RoutedEventHandler sourceUnloaded = null;

            sourceUnloaded = (sender, args) =>
                {
                    if (sender is FrameworkElement)
                        ((FrameworkElement) sender).Unloaded -= sourceUnloaded;
                    else
                        ((FrameworkContentElement) sender).Unloaded -= sourceUnloaded;

                    foreach (var error in errors.Where(err => err.Item1 == sender).ToArray())
                        errors.Remove(error);

                    setHasValidationErrors(errors.Any());
                };

            EventHandler<ValidationErrorEventArgs> errorHandler = (_, args) =>
                {
                    if (args.Action == ValidationErrorEventAction.Added)
                    {
                        errors.Add(new Tuple<object, ValidationError>(args.OriginalSource, args.Error));

                        if (args.OriginalSource is FrameworkElement)
                            ((FrameworkElement)args.OriginalSource).Unloaded += sourceUnloaded;
                        else if (args.OriginalSource is FrameworkContentElement)
                            ((FrameworkContentElement)args.OriginalSource).Unloaded += sourceUnloaded;
                    }
                    else
                    {
                        var error = errors
                            .FirstOrDefault(err => err.Item1 == args.OriginalSource && err.Item2 == args.Error);

                        if (error != null) 
                            errors.Remove(error);
                    }

                    setHasValidationErrors(errors.Any());
                };


            System.Windows.Controls.Validation.AddErrorHandler(element, errorHandler);
        } 
于 2011-11-16T19:50:20.750 に答える