【问题标题】:Ways to randomize text box text that still allow validation?随机化仍然允许验证的文本框文本的方法?
【发布时间】:2020-08-14 13:25:21
【问题描述】:

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

我的想法是在单击按钮时随机化组合框的选定索引和窗口代码隐藏中文本框中的文本,以查看我的实现和验证逻辑是否合理,但使用此方法重复将焦点设置到每个文本框以触发其验证非常繁琐且容易出错。文本框保存double 的值,所以使用UpdateSourceTrigger="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):

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.");
    }
}

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

【问题讨论】:

  • 在 Web 开发中,这通常使用浏览器扩展来完成。您可能必须自己编写代码,并以编程方式引发事件以触发验证序列。你有没有尝试过这样的事情? stackoverflow.com/questions/22718717/…
  • 当我从代码隐藏中更改文本时,有没有办法触发文本框的验证序列?您是否尝试设置 Text 属性?
  • @Rudey 我当前的代码以类似的方式工作,但我没有引发事件,而是调用每个控件的 Focus() 方法。
  • @mm8 是的,我确实在后面的代码中设置了Text 属性,但是因为我已将验证设置为在失去焦点时触发,所以它不会在文本更改时进行验证。我特意选择了这个触发器,否则我的文本框将无法正确地允许手动数据输入。
  • 如何进行验证?

标签: c# wpf validation


【解决方案1】:

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

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

这将触发验证规则。

【讨论】:

  • 好吧,如果有一种更优雅的方式来随机化可以随机化的数据,这不一定依赖于在代码隐藏中写出所有内容,那也很棒。我在代码隐藏中这样做的原因是因为我还没有找到任何替代策略。如果我有一个包含 20 个组合框和 50 个文本框的窗口,我可能会开始拔头发。
  • 我不确定我是否理解您的问题?进行验证的“真实”方式是在视图模型中实现INotifyDataErrorInfo 接口,而不是在视图中使用验证规则。但这是另一个故事。
猜你喜欢
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2018-09-27
相关资源
最近更新 更多