Wpf 如何为绑定到数字数据的文本框激发属性集
我刚刚注意到,当发生非数字事件(例如键入字母/空格或清除文本)时,绑定到数字数据的WPF文本框不会触发Wpf 如何为绑定到数字数据的文本框激发属性集,wpf,textbox,properties,double,numeric,Wpf,Textbox,Properties,Double,Numeric,我刚刚注意到,当发生非数字事件(例如键入字母/空格或清除文本)时,绑定到数字数据的WPF文本框不会触发属性集。当我试图验证一个文本框是否有一个有效的数字时,这就成了一个问题。如果用户键入5并按backspace,则数据绑定属性保持为5,而文本框显示为空!我无法禁用按钮来停止进一步的进程。当绑定到数字数据时,是否仍可以启用非数字通知?或者,我是否被迫使用字符串属性/数据转换器?谢谢。如果您不喜欢默认的转换器,您需要创建自己的转换器,如果输入为空或不可解析,它将返回有效值 public class
属性集。当我试图验证一个文本框是否有一个有效的数字时,这就成了一个问题。如果用户键入5并按backspace,则数据绑定属性保持为5,而文本框显示为空!我无法禁用按钮来停止进一步的进程。当绑定到数字数据时,是否仍可以启用非数字通知?或者,我是否被迫使用字符串属性/数据转换器?谢谢。如果您不喜欢默认的转换器,您需要创建自己的转换器,如果输入为空或不可解析,它将返回有效值
public class IntBindingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string input = value as string;
if (String.IsNullOrWhiteSpace(input))
{
return 0;
}
else
{
int outInt;
if (int.TryParse(input, out outInt))
{
return outInt;
}
else
{
return 0;
}
}
}
}
用法示例:
<TextBox>
<TextBox.Text>
<Binding Path="Max">
<Binding.Converter>
<vc:IntBindingConverter/>
</Binding.Converter>
</Binding>
</TextBox.Text>
</TextBox>
这可能看起来有点混乱,但通常情况下,您实际上只是阻止用户继续操作。如果您不喜欢默认的转换器,则需要创建自己的转换器,如果输入为空或不可解析,该转换器将返回有效值
public class IntBindingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string input = value as string;
if (String.IsNullOrWhiteSpace(input))
{
return 0;
}
else
{
int outInt;
if (int.TryParse(input, out outInt))
{
return outInt;
}
else
{
return 0;
}
}
}
}
用法示例:
<TextBox>
<TextBox.Text>
<Binding Path="Max">
<Binding.Converter>
<vc:IntBindingConverter/>
</Binding.Converter>
</Binding>
</TextBox.Text>
</TextBox>
这看起来可能有点混乱,但通常情况下,您实际上只是阻止用户继续操作。我决定对TextBox进行子类化,并覆盖OnTextChanged()
,因此当此.Text为null/空时,我会将其设置为“0”。由于您对默认转换器的看法可能是正确的,而且您的代码肯定会解决我的问题,所以我接受您的答案。谢谢。对文本框进行子类化对我来说听起来太过分了,但对每个人来说都太过分了…哈哈,不仅仅是因为这个-它还允许我防止字母被打印出来,这更合理,不过,我可能会通过ValidationRules
使用输入验证。我在viewmodel中实现IDataErrorInfo,在这里我打开columnName并调用ViewModelBase.Validate(()=>\u model.Property)
。每个属性都应用了ValidationAttribute,该属性指示Validate应如何对其进行验证。这种方法避免了我的XAML的混乱,并为我的模型提供了一种表示它有效的方法。ValidationRules如何让VM/M知道所有属性何时有效?我决定对TextBox进行子类化,并重写OnTextChanged()
,因此当这个.Text为null/空时,我会将其设置为“0”。由于您对默认转换器的看法可能是正确的,而且您的代码肯定会解决我的问题,所以我接受您的答案。谢谢。对文本框进行子类化对我来说听起来太过分了,但对每个人来说都太过分了…哈哈,不仅仅是因为这个-它还允许我防止字母被打印出来,这更合理,不过,我可能会通过ValidationRules
使用输入验证。我在viewmodel中实现IDataErrorInfo,在这里我打开columnName并调用ViewModelBase.Validate(()=>\u model.Property)
。每个属性都应用了ValidationAttribute,该属性指示Validate应如何对其进行验证。这种方法避免了我的XAML的混乱,并为我的模型提供了一种表示它有效的方法。ValidationRules如何让VM/M知道所有属性何时有效?