2016-04-16 17 views
0

3つのラジオボタンと1つのテキストボックスがあります。 See the image for UIwpfの条件付きデータ検証

ユーザが「電話」ラジオボタンを選択すると、テキストボックスに数字だけを入力できるようにする必要があります。同様に、メールと名前も同じです。 電子メールは正しい形式である必要があります。名前は文字で始める必要があります。 wpfでこれを行うには?

+0

あなたのテキストボックスにデータバインディングを使用していますか? –

+0

@ Albert、はいViewModelのプロパティにTextプロパティをバインドしています – mmrp5

答えて

0

次を試してください:

のTextBoxコード

<TextBox x:Name="TextBoxWithValidation" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Text="{Binding Text, UpdateSourceTrigger=LostFocus, Mode=TwoWay, 
          NotifyOnValidationError=True, ValidatesOnDataErrors=True}"> 
     <Validation.ErrorTemplate> 
      <ControlTemplate> 
       <DockPanel> 
        <Border BorderBrush="Red" BorderThickness="1"> 
         <AdornedElementPlaceholder x:Name="ControlWithError"/> 
        </Border> 
        <ContentControl x:Name="ValidationSymbol" Margin="-10,0,0,0" Content="{Binding ElementName=ControlWithError, 
        Path=AdornedElement.(Validation.Errors), Converter={wpfValidationIssueHelpAttempt:Errors2ValidationErrorContentConverter}, 
        UpdateSourceTrigger=PropertyChanged}" ContentTemplate="{StaticResource CommonValidationSymbol}"/> 
       </DockPanel> 
      </ControlTemplate> 
     </Validation.ErrorTemplate> 
    </TextBox> 

コンバータコード:

public class Errors2ValidationErrorContentConverter : MarkupExtension, IValueConverter 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var errors = value as ReadOnlyCollection<ValidationError>; 
     ValidationError error; 
     if (errors == null || (error = errors.FirstOrDefault()) == null) return null; 
     return error.ErrorContent.ToString(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

検証シンボルコード(リソースセクションにこれを置きます) :

 <DataTemplate x:Key="CommonValidationSymbol"> 
      <TextBlock Panel.ZIndex="1000" Foreground="Red" FontFamily="Segoe UI" FontWeight="Bold" 
          Width="10" 
          FontSize="15" Background="#0000FF00" Text="!"> 
     <ToolTipService.ToolTip> 
      <ToolTip x:Name="validationTooltip" Content="{Binding }" Placement="Right"/> 
     </ToolTipService.ToolTip> 
      </TextBlock> 
     </DataTemplate> 

は、ここに私のDataContextコード

public class MainViewModel:BaseObservableObject, IDataErrorInfo 
{ 
    private string _text; 
    private string _error; 
    private bool _isMailChecked; 
    private bool _isNameChecked; 
    private bool _isPhoneChecked; 

    public virtual string Text 
    { 
     get { return _text; } 
     set 
     { 
      _text = value; 
      OnPropertyChanged(() => Text); 
     } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
      if (columnName == "Text") 
      { 
       if (string.IsNullOrEmpty(Text)) return string.Empty; 
       Error = string.Empty; 
       return GetValidationResult(); 
      } 
      return String.Empty; 
     } 
    } 

    private string GetValidationResult() 
    { 
     //define your logic here 
     if (IsNameChecked) 
     { 
      Error = "name is wrong!"; 
     } 
     if (IsMailChecked) 
     { 
      Error = "mail is wrong!"; 
     } 
     if (IsPhoneChecked) 
     { 
      Error = "phone is wrong"; 
     } 

     return Error; 
    } 

    public string Error 
    { 
     get { return _error; } 
     private set 
     { 
      _error = value; 
      OnPropertyChanged(() => Error); 
     } 
    } 

    public bool IsNameChecked 
    { 
     get { return _isNameChecked; } 
     set 
     { 
      _isNameChecked = value; 
      OnPropertyChanged(() => IsNameChecked); 
      if (value == false) return; 
      IsMailChecked = false; 
      IsPhoneChecked = false; 
      Text = String.Empty; 
     } 
    } 

    public bool IsMailChecked 
    { 
     get { return _isMailChecked; } 
     set 
     { 
      _isMailChecked = value; 
      OnPropertyChanged(() => IsMailChecked); 
      if (value == false) return; 
      IsNameChecked = false; 
      IsPhoneChecked = false; 
      Text = String.Empty; 
     } 
    } 

    public bool IsPhoneChecked 
    { 
     get { return _isPhoneChecked; } 
     set 
     { 
      _isPhoneChecked = value; 
      OnPropertyChanged(() => IsPhoneChecked); 
      if (value == false) return; 
      IsMailChecked = false; 
      IsNameChecked = false; 
      Text = String.Empty; 
     } 
    } 
} 

よろしくです。

+0

こんにちは、インデクサメソッドへの呼び出しがありません – mmrp5

+0

実際には、別のクラスにOnpropertyChnaged(..)実装があります。そのクラスのインデクサメソッドを宣言する必要がありますか? – mmrp5

+0

@ mmrp5どこでPropertyChangedイベントを起こしますか?ビューモデルを公開できますか? – Ilan