使用 WPF 转换器处理瞬态值

本文关键字:处理 WPF 转换器 使用 | 更新日期: 2023-09-27 18:36:28

我有一个转换器,用来对数字进行舍入。它看起来像这样:

public class RoundNumberConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!value.IsNumber())
            return DependencyProperty.UnsetValue;
        return Math.Round((float)value, 2).ToString();
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        float number;
        if (float.TryParse(value.ToString(), out number))
            return number;
        return DependencyProperty.UnsetValue;
    }
}

这工作正常,直到我将UpdateTrigger切换到PropertyChanged。现在,当我尝试输入值 1.23 时,1 个字符按预期工作,但当我输入句点时,1。转换为 1.0,并且由于值未更改,因此不会在我的视图模型中设置它。此外,1.在文本框中显示时转换为字符串 1,因此用户无法添加句点。有没有人有一个简单的方法来解决这个问题?

使用 WPF 转换器处理瞬态值

我通过这样做修复了它:

public class RoundNumberConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!value.IsNumber())
            return DependencyProperty.UnsetValue;
        return Math.Round((float)value, 2).ToString();
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return DependencyProperty.UnsetValue;
        var svalue = value.ToString();
        if (svalue.EndsWith(".")) // Prevents problems when using this with UpdateTrigger.PropertyChanged and user enters 1.
            return DependencyProperty.UnsetValue;
        float number;
        if (!float.TryParse(svalue, out number))
            return DependencyProperty.UnsetValue;
        return number;
    }
}