1

WPF で Validation を使用しようとしています。以下に示すように、NotNullOrEmptyValidationRule を作成しました。

public class NotNullOrEmptyValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (String.IsNullOrEmpty(value as String))
                return new ValidationResult(false, "Value cannot be null or empty");

            return new ValidationResult(true, null); 
        }
    }

今、私は自分のアプリケーションでそれを使用する必要があります。App.xaml ファイルで、TextBox のスタイルを宣言しました。これが宣言です。

 <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">

            <Setter Property="Background" Value="Green"/>

            <Style.Triggers>

                <Trigger Property="Validation.HasError" Value="True">

                    <Setter Property="Background" Value="Red"/>
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>

                </Trigger>

            </Style.Triggers>

        </Style>

今、私は自分の TextBox でそれを使用したいので、次のコードを使用しています:

  <TextBox Style="{StaticResource textBoxStyle}">
                <TextBox.Text>
                    <Binding>
                        <Binding.ValidationRules>
                            <NotNullOrEmptyValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>


            </TextBox>

エラーはタグ NotNullOrEmptyValidationRule で発生します。XAML 構文チェッカーは、NotNullOrEmptyValidationRule を解決できません。名前空間を入れてみましたが、うまくいかないようです。

4

4 に答える 4

5

ウィンドウにxmlnsを追加し、それを使用してValidationRuleを参照する必要があります。

WPFでは、オブジェクトは同じアセンブリから使用するのにまったく問題ありません。

ルールは標準のXAML名前空間で定義されていないため、次のようにclr名前空間へのマッピングを作成する必要があります。

<Window ...
    xmlns:local="clr-namespace:MyNamespaceName">

そして、あなたはそれを次のように使うでしょう:

<Binding Path=".">
    <Binding.ValidationRules>
        <local:NotNullOrEmptyValidationRule />
    </Binding.ValidationRules>
</Binding>

編集 私はBindingにPathステートメントを追加しました。何にバインドするかをBindingに指示する必要があります:)

于 2008-09-18T20:24:02.777 に答える
1

TextBox のバインディングが 'Text' のパスに設定されているのがわかります。これは、このテキスト ボックスのデータ コンテキストが何であれ、そのフィールドですか? テキストボックスは実際に値を入れていますか? また、検証メソッドにブレークポイントを設定した場合、それが起動されることはありますか?

バインディングの失敗をログに記録する方法を調べて、それらも確認することをお勧めします..

于 2008-09-19T03:06:58.923 に答える
1

あなたのコードビハインドにはこの行がありません

Public Sub New()

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    Me.**NameOfTextBox**.DataContext = Me
End Sub
于 2010-09-03T06:41:29.693 に答える
0

Visual Studio と Expression Blend には、この問題を引き起こすバグがあります。あなたがする必要があるのは、検証ルールが参照できる個別のプロジェクト/アセンブリにあることを確認することです。これで問題は解決するはずです。

ただし、名前空間を機能させるには、名前空間を追加し直す必要があります。

于 2008-09-18T20:14:43.890 に答える