Xaml 带有浮点值的文本框也可以接受空值

Xaml 带有浮点值的文本框也可以接受空值,xaml,uwp,uwp-xaml,Xaml,Uwp,Uwp Xaml,我需要创建接受浮点值或空白值的文本框。我们将XAML/UWP与C#结合使用,还将使用Microsoft UI Toolkit进行浮点值验证。我们有与实体类的双向绑定。此实体类用于获取/更新数据库。如果我们的浮点没有值,它会在文本框中显示“0”,请参见下图- 当我将此文本框设置为空白并按“Tab”键时 像这样,它会产生一个错误 参数不正确。无法将该值转换为Single类型` 应用程序崩溃 当我在C#类中将float转换为float?并重建项目时,它给出了编译错误- 在写入绑定代码的XAML文本

我需要创建接受浮点值或空白值的文本框。我们将XAML/UWP与C#结合使用,还将使用Microsoft UI Toolkit进行浮点值验证。我们有与实体类的双向绑定。此实体类用于获取/更新数据库。如果我们的浮点没有值,它会在文本框中显示“0”,请参见下图-

当我将此文本框设置为空白并按“Tab”键时

像这样,它会产生一个错误

参数不正确。无法将该值转换为Single类型`

应用程序崩溃

当我在C#类中将
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。您还可以根据特定类型或功能命名处理程序。另外,我应该指出,有三种不同的方法可以根据偏好/需要来做,因为最初没有提供足够的细节,以防不够清楚。实际上,要实现的控件甚至没有那么多。