我在WPF中使用UpdateSourceTrigger时遇到Float数据类型的问题。我有一个属性为float数据类型,并将它绑定到TextBox并将其绑定的UpdateSourceTrigger设置为PropertyChanged,但WPF不让我输入'。'在TextBox中,除非我将UpdateSourceTrigger更改为LostFocus。我认为这是因为我们无法输入'。'在浮动值的最后。我不知道如何解决它,因为我需要输入'。'并将UpdateSourceTrigger设置为PropertyChanged。
我设计的文本框只能使用7个字符 例如 1)12.3456 2)1234.56 e.t.c
该属性是:`
public float? Expenditure
{
get;set;
}
在XAML中:
<TextBox Text="{Binding Expenditure, UpdateSourceTrigger=PropertyChanged}"/>
StringFormat没有帮助,因为十进制可以放在任何地方。 任何帮助都会很棒。
答案 0 :(得分:2)
只需更改绑定的StringFormat属性即可显示属性的两个小数位:
<TextBox Text="{Binding Expenditure, UpdateSourceTrigger=PropertyChanged, StringFormat='{}{0:F2}'}"/>
你也可以写一个自定义的FloatToStringConverter(here就是一个例子)。您自己的float-to-string和string-to-float转换方法将允许您处理TextBox的空文本字段并将其转换为null。
答案 1 :(得分:2)
我写了一个值转换器来解决你的问题:
<强>用法:强>
<Window x:Class="BindingExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BindingExample"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:DoubleToStringConverter x:Key="DoubleToStringConverter" DigitsCount="5"/>
</Window.Resources>
<StackPanel>
<TextBox Text="{Binding FloatProperty, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}}" Margin="5"/>
</StackPanel>
</Window>
<强>转换器:强>
[ValueConversion(typeof(double), typeof(string))]
public class DoubleToStringConverter : IValueConverter
{
#region IValueConverter Members
public DoubleToStringConverter()
{
// Default value for DigitsCount
DigitsCount = 7;
}
// Convert from double to string
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
double doubleValue = System.Convert.ToDouble(value);
// Calculate digits count
int digitsBeforePoint = System.Convert.ToInt32(Math.Ceiling(Math.Log10(doubleValue)));
int digitsAfterPoint = DigitsCount - digitsBeforePoint;
// TODO: You have to handle cases where digitsAfterPoint < 0
// Create formatString that is used to present doubleValue in desired format
string formatString = String.Format("{{0:F{0}}}", digitsAfterPoint);
return String.Format(formatString, doubleValue);
}
// Convert from string to double
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
double? result = null;
try
{
result = System.Convert.ToDouble(value);
}
catch
{
}
return result.HasValue ? (object)result.Value : DependencyProperty.UnsetValue;
}
public int DigitsCount { get; set; }
#endregion
}