【问题标题】:Conditional data validation in wpfwpf中的条件数据验证
【发布时间】:2016-04-16 06:58:37
【问题描述】:

我有 3 个单选按钮和一个文本框。 See the image for UI

当用户选择“电话”单选按钮时,我应该只允许在文本框中输入数字,类似于其他情况下的电子邮件和姓名。 电子邮件格式应正确。名称应以字符开头。 如何在 wpf 中做到这一点?

【问题讨论】:

  • 您是否在文本框中使用数据绑定?
  • @ Albert ,是的,我将它的 Text 属性绑定到 viewmodel 中的属性

标签: wpf validation idataerrorinfo


【解决方案1】:

请尝试下一个:

文本框代码

 <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;
        }
    }
}

问候。

【讨论】:

  • 嗨,我没有接到索引器方法的调用
  • 实际上我在不同的类中有我的 OnpropertyChnaged(..) 实现。我应该在那个类中声明索引器方法吗?
  • @mmrp5 你在哪里引发 PropertyChanged 事件?你能发布你的视图模型吗?
  • 公共类 NotifyPropChangedImpl : INotifyPropertyChanged { protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } /// /// 要处理的事件 PropertyChangedEventHandler delegate /// public event PropertyChangedEventHandler PropertyChanged = delegate { }; }
  • 对不起,我是新来的..所以不知道如何发布课程
猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多