Xaml 带有浮点值的文本框也可以接受空值
我需要创建接受浮点值或空白值的文本框。我们将XAML/UWP与C#结合使用,还将使用Microsoft UI Toolkit进行浮点值验证。我们有与实体类的双向绑定。此实体类用于获取/更新数据库。如果我们的浮点没有值,它会在文本框中显示“0”,请参见下图- 当我将此文本框设置为空白并按“Tab”键时 像这样,它会产生一个错误 参数不正确。无法将该值转换为Single类型` 应用程序崩溃 当我在C#类中将Xaml 带有浮点值的文本框也可以接受空值,xaml,uwp,uwp-xaml,Xaml,Uwp,Uwp Xaml,我需要创建接受浮点值或空白值的文本框。我们将XAML/UWP与C#结合使用,还将使用Microsoft UI Toolkit进行浮点值验证。我们有与实体类的双向绑定。此实体类用于获取/更新数据库。如果我们的浮点没有值,它会在文本框中显示“0”,请参见下图- 当我将此文本框设置为空白并按“Tab”键时 像这样,它会产生一个错误 参数不正确。无法将该值转换为Single类型` 应用程序崩溃 当我在C#类中将float转换为float?并重建项目时,它给出了编译错误- 在写入绑定代码的XAML文本
float
转换为float?
并重建项目时,它给出了编译错误-
在写入绑定代码的XAML文本框上,无法将类型“string”隐式转换为“float?”
XAML代码-
....
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:extensions="using:Microsoft.Toolkit.Uwp.UI.Extensions"
....
<TextBox
extensions:TextBoxRegex.ValidationMode="Dynamic"
extensions:TextBoxRegex.ValidationType="Custom"
extensions:TextBoxRegex.Regex="[-+]?[0-9]*\.?[0-9]+"
Text="{x:Bind VM.percentage, Mode=TwoWay}"/>
。。。。
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:extensions=“使用:Microsoft.Toolkit.Uwp.UI.extensions”
....
请帮忙
参数不正确。无法将该值转换为Single类型`
问题是您已将百分比设置为null
,但浮点类型永远不能设置为null值。对于这种情况,我们需要在绑定值双向模型时使用IValueConverter
public class FloatToString : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if ((float)value == 0f)
{
return string.Empty;
}
else
{
return value.ToString();
}
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
try
{
if ((string)value == string.Empty)
{
return 0f;
}
return float.Parse(value as string);
}
catch (Exception)
{
return 0f;
}
}
}
用法
<Page.Resources>
<local:FloatToString x:Key="FlotToStringConverter" />
</Page.Resources>
<Grid>
<TextBox Height="44" Text="{x:Bind Percentage, Mode=TwoWay, Converter={StaticResource FlotToStringConverter}, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
参数不正确。无法将该值转换为Single类型`
问题是您已将百分比设置为null
,但浮点类型永远不能设置为null值。对于这种情况,我们需要在绑定值双向模型时使用IValueConverter
public class FloatToString : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if ((float)value == 0f)
{
return string.Empty;
}
else
{
return value.ToString();
}
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
try
{
if ((string)value == string.Empty)
{
return 0f;
}
return float.Parse(value as string);
}
catch (Exception)
{
return 0f;
}
}
}
用法
<Page.Resources>
<local:FloatToString x:Key="FlotToStringConverter" />
</Page.Resources>
<Grid>
<TextBox Height="44" Text="{x:Bind Percentage, Mode=TwoWay, Converter={StaticResource FlotToStringConverter}, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
在这里,我首先要说的是,在不查看C类的情况下,为与xaml关联的页面或窗口绑定文本和代码隐藏文件。如果这不起作用,您可以尝试其他一些方法
首先引发异常,因为的值无法转换为单精度浮点整数(float)
根据所提供的信息,您可以采取几种方法,我认为您可以简单地使用下面的活动。此外,您还需要在下面的文本框中添加一个名称,以便通过x:name属性访问代码隐藏中xaml中声明的字段
....
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:extensions="using:Microsoft.Toolkit.Uwp.UI.Extensions"
....
<TextBox x:Name="yourTextBoxName"
extensions:TextBoxRegex.ValidationMode="Dynamic"
extensions:TextBoxRegex.ValidationType="Custom"
extensions:TextBoxRegex.Regex="[-+]?[0-9]*\.?[0-9]+"
Text="{x:Bind VM.percentage, Mode=TwoWay}"
TextChanged="Textbox_OnTextChanged" />
如果我没有弄错的话,你应该已经在使用这个方法,或者可能在其中一个c#文件中也使用这个方法
如果这干扰了您的绑定,我可能还需要看一小段C#,以便能够提供帮助。这种方法也应该允许您始终看到0
如果您喜欢空白,只需稍微更改事件处理程序中的逻辑,或者更好,而不是使用TextBox.TextChanged事件,您可以使用或类似的事件
private void TextBox_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Return)
{
if (string.IsNullOrEmpty(yourTextBoxName.Text))
yourTextBoxName.Text = 0;
}
}
或
不必看C#类,就可以在这里为与xaml关联的页面或窗口绑定文本和代码隐藏文件,我首先要说的是尝试以下方法。如果这不起作用,您可以尝试其他一些方法
首先引发异常,因为的值无法转换为单精度浮点整数(float)
根据所提供的信息,您可以采取几种方法,我认为您可以简单地使用下面的活动。此外,您还需要在下面的文本框中添加一个名称,以便通过x:name属性访问代码隐藏中xaml中声明的字段
....
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:extensions="using:Microsoft.Toolkit.Uwp.UI.Extensions"
....
<TextBox x:Name="yourTextBoxName"
extensions:TextBoxRegex.ValidationMode="Dynamic"
extensions:TextBoxRegex.ValidationType="Custom"
extensions:TextBoxRegex.Regex="[-+]?[0-9]*\.?[0-9]+"
Text="{x:Bind VM.percentage, Mode=TwoWay}"
TextChanged="Textbox_OnTextChanged" />
如果我没有弄错的话,你应该已经在使用这个方法,或者可能在其中一个c#文件中也使用这个方法
如果这干扰了您的绑定,我可能还需要看一小段C#,以便能够提供帮助。这种方法也应该允许您始终看到0
如果您喜欢空白,只需稍微更改事件处理程序中的逻辑,或者更好,而不是使用TextBox.TextChanged事件,您可以使用或类似的事件
private void TextBox_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Return)
{
if (string.IsNullOrEmpty(yourTextBoxName.Text))
yourTextBoxName.Text = 0;
}
}
或
你能分享你的xaml代码吗?@PavelAnikhouski我分享我的有问题的xaml代码,请再看我的问题。你分享你的xaml代码吗?@PavelAnikhouski我分享我的有问题的xaml代码,请再次查看我的问题Hanks,但是当单个页面上的文本框超过4个时,很难实现…实际上,您只需要根据需要使用具有不同名称的事件处理程序。因此,您可以将其命名为TextBox1\u OnKeyUp、TextBox2\u OnKeyUp等,而不是TextBox\u OnKeyUp。您还可以根据特定类型或功能命名处理程序。另外,我应该指出,有三种不同的方法可以根据偏好/需要来做,因为最初没有提供足够的细节,以防不够清楚。这实际上没有那么多控件需要实现。谢谢,但是当一个页面上的文本框超过4个时,很难实现…实际上,您只需要根据需要使用具有不同名称的事件处理程序。因此,您可以将其命名为TextBox1\u OnKeyUp、TextBox2\u OnKeyUp等,而不是TextBox\u OnKeyUp。您还可以根据特定类型或功能命名处理程序。另外,我应该指出,有三种不同的方法可以根据偏好/需要来做,因为最初没有提供足够的细节,以防不够清楚。实际上,要实现的控件甚至没有那么多。