0

検証に問題があり、これまでのところ本当に苦労しています。私はいくつかのコードを変更し、これについて多くのことを読み、ほとんどの道のりでこのガイドに従いました: http://developingfor.net/2009/10/13/using-custom-validation-rules-in-wpf/しかし、私は問題があります。検証が開始されず、その理由がわかりません! 私のコードの一部を投稿します。

    public class RequiredFields : ValidationRule
    {
        private String _errorMessage = String.Empty;
        public string ErrorMessage
        {
            get { return _errorMessage; }
            set { _errorMessage = value; }
        }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            var str = value as string;

            if (String.IsNullOrEmpty(str))
            {
                return new ValidationResult(false, this.ErrorMessage);
            }

            return new ValidationResult(true, null);
        }
    }

XAML:

        <Style
x:Key="textBoxInError"
TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger
        Property="Validation.HasError"
        Value="true">
                <Setter
            Property="ToolTip"
            Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
                <Setter
            Property="Background"
            Value="Red" />
                <Setter
            Property="Foreground"
            Value="White" />
            </Trigger>
        </Style.Triggers>
    </Style>

テキストボックス XAML:

 <TextBox x:Name="txtFirstName" Validation.ErrorTemplate="{StaticResource validationTemplate}" HorizontalAlignment="Left" Height="23" Margin="156,62,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="149">
        <TextBox.Text>
            <Binding Path="FirstName"  UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
                <Binding.ValidationRules>
                    <validators:RequiredFields ErrorMessage="Name is Required" />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

XAML ウィンドウの CodeBehind には次のものがあります。

        RequiredFields ss = new RequiredFields();
        this.DataContext = ss;

しかし、何らかの理由で、イベントが発生することはありません。ValidationResult でブレークポイントをマークすると、何もしません。

4

1 に答える 1

1

ValidationRule もとRequiredFieldsして使用されますDataContextが、プロパティFirstNameは宣言されていません。したがって、バインディングは実際には失敗しています。別の ViewModel を定義する必要があります。DataContext として引き続き使用する場合は、次のようRequiredFieldsにプロパティを追加する必要がありますFirstName

public class RequiredFields : ValidationRule, INotifyPropertyChanged
{
    private String _errorMessage = String.Empty;
    public string ErrorMessage
    {
        get { return _errorMessage; }
        set { _errorMessage = value; }
    }

    public override ValidationResult Validate(object value, 
                                              CultureInfo cultureInfo)
    {
        var str = value as string;

        if (String.IsNullOrEmpty(str))
        {
            return new ValidationResult(false, this.ErrorMessage);
        }

        return new ValidationResult(true, null);
    }
    //Implements INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string prop){
       var handler = PropertyChanged;
       if(handler != null) handler(this, new PropertyChangedEventArgs(prop));
    }
    //add the property FirstName
    string _firstName;
    public string FirstName { 
       get {
           return _firstName;
       }
       set {
          if(_firstName != value) {
             _firstName = value;
             OnPropertyChanged("FirstName");
          }
       }
    }
}

上記のコードは、実際の実践ではなく、簡単な修正と実証的な解決策です。既存の ValidationRule を使用するのではなく、別のINotifyPropertyChangedViewModelを実装して実装する基本クラスを作成する必要があります。

于 2014-10-27T02:58:17.513 に答える