7

Float我在数据类型和UpdateSourceTriggerin 中有一个有趣的问题WPF。我有一个浮点数据类型的属性并将其绑定到一个TextBox和一组UpdateSourceTriggerBinding to PropertyChanged,但WPF不要让我输入“。” 在TextBox除非我更改UpdateSourceTriggerLostFocus。我认为这是因为我们不能输入“。” 在浮点值的末尾。我不知道如何修复它,因为我需要输入“。” 并设置UpdateSourceTriggerPropertyChanged

该物业是:

  public float? Amount
    {
        get;set;
    }

在 XAML 中:

    <TextBox
        Text="{Binding Amount , UpdateSourceTrigger=PropertyChanged}"/>
4

4 回答 4

3

如果您在绑定中添加 StringFormat 语句,可能会有所帮助:

<TextBox
    Text="{Binding Amount, StringFormat='{}{##.##}', UpdateSourceTrigger=PropertyChanged}"/>    

更新:我看到我的第一个答案引发了一些绑定错误..

另一种选择是使用转换器(有效,但有点脏;-)):

...
<Window.Resources>        
    <local:FloatConverter x:Key="FloatConverter" />
</Window.Resources>
...
<TextBox Text="{Binding Amount, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource FloatConverter}}"></TextBox>

转换器:

public class FloatConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
     return value;
  }

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
     // return an invalid value in case of the value ends with a point
     return value.ToString().EndsWith(".") ? "." : value;
  }

}

于 2013-06-17T08:00:04.650 回答
1

这是因为绑定到浮点数据类型会自动导致 WPF 添加float validator. 您可以通过使用不同DataAnnotationfloat属性或编写自己的来绕过此问题Validator

http://wpf-4-0.blogspot.de/2012/12/data-annotations-in-wpf-c.html

编辑:我看到你有一个nullable float,所以你也可以尝试将它设置TargetNullValue为“。”。

于 2013-06-17T07:20:32.893 回答
1

如果您有 .NET 4.5 或更高版本,则可以强制执行 4.5 之前的行为

System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;

在 .NET 4.5 中,默认情况下不再可以输入分隔符(逗号或点)UpdateSourceTrigger = PropertyChanged

你也可以有延迟:

<TextBox Width="100" Margin="10" Text="{Binding DoubleField, UpdateSourceTrigger=PropertyChanged,Delay=500, ValidatesOnDataErrors=True}">

另一种方法是使用 IValueConverter:

public class DoubleToPersistantStringConverter : IValueConverter
{
    private string lastConvertBackString;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (!(value is double)) return null;

        var stringValue = lastConvertBackString ?? value.ToString();
        lastConvertBackString = null;

        return stringValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (!(value is string)) return null;

        double result;
        if (double.TryParse((string)value, out result))
        {
            lastConvertBackString = (string)value;
            return result;
        }

        return null;
    }
}

检查此链接: Binding to double field with validation

但我认为最好的方法是你设置UpdateSourceTriggerLostFocus.

于 2019-09-01T06:58:51.030 回答
0

尝试将 StringFormat 定义添加到绑定中。像这样:

<TextBox Name="txtPower" Height="23" 
TextWrapping="Wrap" Text="{Binding Path=Power, Mode=TwoWay, 
UpdateSourceTrigger=PropertyChanged,StringFormat=N2}"></TextBox>
于 2013-06-17T11:49:38.443 回答