如何随机化仍允许验证的文本框文本



我有一个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.");
}
}

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

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

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

这将导致启动验证规则。

相关内容

  • 没有找到相关文章

最新更新