2017-11-16 7 views
1

バインディングを使用してテキストボックスのボタンクリックで検証を達成しようとしています。基本的に、[送信]をクリックすると、テキストボックスが赤くならず、「必須」エラーが表示されます。テキストを追加すると、そのテキストが表示されます。IDataErrorInfoをボタンクリックイベントで実装する

私は妥当性確認時に新しいです、そして、これを一週間ほど、欲求不満で起きています。私は私の答えが何かを持っているかもしれないと思います。しかし私は確信していないし、専門家に尋ねることに頼っています。

このすべての助けと感謝しなければならないでしょう。ここで

は私のモデルクラスである:ここで

public class sForms : INotifyPropertyChanged, IDataErrorInfo 

{ 
    private string name; 
    public string NAME { get { return name; } set { if (name != value) name = value.Trim(); OnPropertyChanged("NAME"); } } 


    public string this[string columnName] 
    { 
     get 
     { 
      return ValidationError(columnName); 
     } 

    } 

    public string Error { get { return null; } } 


    private string ValidationError(string columnName) 
    { 
     string error = null; 
     switch (columnName) 
     { 
      case "NAME": 
       error = IsNameValid(); 
       break; 
     } 
     return 
      error; 
    } 

    static readonly string[] ValidatedProperties = { "NAME" }; 

    public bool IsValid 
    { 
     get 
     { 
      foreach (string property in ValidatedProperties) 
      { 
       if (ValidationError(property) != null) 
       { 
        return 
         false; 
       } 
      } 
      return 
       true; 
     } 
    } 

    public string IsNameValid() 
    { 
     if (string.IsNullOrWhiteSpace(NAME) || string.IsNullOrEmpty(NAME)) 
      return "Required"; 
     else 
      return 
       null; 
    } 


    #region Property Changed 
    private void OnPropertyChanged(string propertyName) 
    { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    #endregion 
} 

は私のボタン+テキストボックスのための私のXAMLです。

 <TextBox Controls:TextBoxHelper.UseFloatingWatermark="True" 
        Controls:TextBoxHelper.Watermark="Name *"       
        Grid.Column="1" Grid.Row="1" 
        Margin="0 0 2 0"   
        Text="{Binding Path=NAME, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
        > 
     <Button Content="Submit"      
       Style="{DynamicResource SquareButtonStyle}" 
       VerticalAlignment="Bottom" HorizontalAlignment="Right" 
       Margin="0 0 10 0"  
       Click="Submit_Click" 
       /> 

ここに私のコードがあります。

 public v_subsForm() 
    { 
     InitializeComponent(); 
     this.DataContext = subs; 
    } 

    sForms subs = new sForms(); 
    #region PropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 

    private void Submit_Click(object sender, RoutedEventArgs e) 
    { 
     if (subs.IsValid) 
      MessageBox.Show("True"); 
     else 
      MessageBox.Show("False"); 
    } 
+0

達成するために何を達成しようとしていますか? –

+0

「送信ボタン」をクリックすると、NAMEテキストボックスにヌルであるために検証エラーが表示されます。 –

+0

申し訳ありませんが、今はあなたを助けることができませんが、[WPFチャットルーム](https://stackoverflow.com/questions/47325597/implement-idataerrorinfo-on-button-click-event)あなたも助けを受けるとき。 –

答えて

0

最初に、必要なすべてのリソースが含まれていると仮定して、コードを実行します。また、あなたのコードビハインドにINotifyPropertyChangedを実装する必要はありません(私の推測するMainWindowです)。

私はバインディングを使用してテキストボックスのボタンクリックで検証を達成しようとしています。

これはどのようにIDataErrorInfoの動作ではありません。 IDataErrorInfoは、バインディングがバインドされているオブジェクトのエラーを照会できるAPIを定義しています。したがって、プロパティが変更された場合、のバインディングはsFormsオブジェクトのインデクサにクエリを行います。subs["NAME"]。エラーが発生すると、エラーテンプレートが適用されます。これは、通常、送信ボタンとペアになっています。そのボタンのCommandは、CanExecuteがエラーをチェックするコマンドにバインドされています。エラーがある場合、ボタンは無効です(エラーがある場合は送信できません。

ボタンクリックで検証を行いたい場合は、IDataErrorInfoを実装する必要はありません。 System.Windows.Controls.Validationクラスには、エラーの表示を駆動するプロパティが添付されています。HasErrorErrorsErrorTemplate。しかし、Validation.ErrorTemplateのようにValidation.HasErrorをtrueに設定することはできません(アクセス可能なセッターはありません)。コードの後ろにValidation.HasErrorを設定するには、Validation.MarkInvalidメソッドを使用できますが、これは通常行われる方法ではありません。これが機能するためにここでは、MyTextBoxをへごTextBoxNameプロパティを設定する必要があり、簡単な例である:MyTextBox.Textが空の場合

private void Submit_Click(object sender, RoutedEventArgs e) 
{ 
    if (!string.IsNullOrEmpty(MyTextBox.Text)) return; 

    BindingExpression bindingExpression = 
     BindingOperations.GetBindingExpression(MyTextBox, TextBox.TextProperty); 

    BindingExpressionBase bindingExpressionBase = 
     BindingOperations.GetBindingExpressionBase(MyTextBox, TextBox.TextProperty); 

    ValidationError validationError = 
     new ValidationError(new ExceptionValidationRule(), bindingExpression); 

    validationError.ErrorContent = "My error message."; 

    Validation.MarkInvalid(bindingExpressionBase, validationError); 
} 

はだから、それは無効とみなされます。

関連する問題