首页 > 解决方案 > 随机化仍然允许验证的文本框文本的方法?

问题描述

我有一个 WPF 窗口,其中包含一些ComboBox控件TextBox。我在初始化时填充组合框,并且文本框对我的视图模型中的某些属性具有双向绑定。

我的想法是在单击按钮时随机化组合框的选定索引和窗口代码隐藏中文本框中的文本,只是为了查看我的实现和验证逻辑是否合理,但是使用这种方法非常乏味而且容易出错,反复将焦点设置到每个文本框以触发其验证。文本框包含 的值double,因此 usingUpdateSourceTrigger="PropertyChanged"不允许手动输入小数点符号(点或逗号或你有什么),我觉得应该支持这两种输入法。

示例xaml代码:

<TextBox x:Name="DataValueBox" Grid.Row="3" Grid.Column="3" Height="auto" VerticalAlignment="Center" Margin="10 0">
    <TextBox.Text>
        <Binding ElementName="DataComboBox"
                 Path="SelectedItem.Value"
                 Mode="TwoWay"
                 ValidatesOnExceptions="True"
                 NotifyOnValidationError="True"
                 UpdateSourceTrigger="LostFocus">
            <Binding.ValidationRules>
                <validators:DoubleRule />
            </Binding.ValidationRules>
            <Binding.Converter>
                <converters:StringToDoubleConverter />
            </Binding.Converter>
        </Binding>
    </TextBox.Text>
</TextBox>

字符串到双倍转换器(在验证后发生):

public class StringToDoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        => value.ToString();

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        => double.Parse(value.ToString(), NumberStyles.Float, CultureInfo.CurrentCulture);
}

字符串验证(检查字符串是否代表double当前文化中的 a):

public class DoubleRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string valueString = value.ToString();
        NumberStyles style = NumberStyles.Float;
        CultureInfo culture = CultureInfo.CurrentCulture;
        double _ = 0.0;

        // Initial parse attempt
        bool parsed = double.TryParse(valueString, style, culture, out _);
        return parsed ? ValidationResult.ValidResult : new ValidationResult(false, "Please input a valid decimal number.");
    }
}

当我从代码隐藏更改文本时,有没有办法触发文本框的验证序列,或者有没有更好的方法来提供将触发验证的随机数据?

标签: c#wpfvalidation

解决方案


由于您已经在代码隐藏中设置Text了元素的属性,因此TextBox您也可以显式更新源代码:

textBox.Text = "some random value...";
var be = textBox.GetBindingExpression(TextBox.TextProperty);
if (be != null)
    be.UpdateSource();

这将导致验证规则触发。


推荐阅读