【发布时间】:2020-08-14 13:25:21
【问题描述】:
我有一个 WPF 窗口,其中包含一些 ComboBox 和 TextBox 控件。我在初始化时填充组合框,并且文本框对我的视图模型中的某些属性具有双向绑定。
我的想法是在单击按钮时随机化组合框的选定索引和窗口代码隐藏中文本框中的文本,以查看我的实现和验证逻辑是否合理,但使用此方法重复将焦点设置到每个文本框以触发其验证非常繁琐且容易出错。文本框保存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