我有一个名为EngrNumberBox的UserControl,该函数用于在文本框中接收数字,并将其转换为工程数字符号。示例:用户放置0.0123456,失去焦点后,文本框将格式更改为数字并显示12.345m。另一个示例:12345-> 12.345K 为此,我编写了一个名为EngrNumber的Struct,它的行为就像一个浮点数,由1)小数字段(尾数)和2)字符串字段的前缀(指数)组成。
文本框使用了一个Converter,可以在String和EngrNumber之间进行转换。 我想将此EngrNumberBox赋予允许或禁止负数的属性。如果不允许使用负数,并且用户在文本框中输入了负数,则控件会将其变为正数,并在失去焦点后立即在文本框中显示该数字。 因此,我尝试使用转换器参数作为代表AllowNegativeNumber的布尔值。但是在运行时,该参数始终为null,我无法正确绑定该参数:
以下是UserControl的XAML:
<UserControl
x:Class="Transition.CustomControls.EngrNumberBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Transition.CustomControls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local1="using:Transition"
mc:Ignorable="d" x:Name="control"
d:DesignHeight="300"
d:DesignWidth="400">
<UserControl.Resources>
<local1:EngrConverter x:Key="engrConverter"/>
</UserControl.Resources>
<Grid>
<TextBox Style="{StaticResource EngrNumberBoxStyle}"
x:Name="txtBox"
IsSpellCheckEnabled="False"
IsTextPredictionEnabled="False" Width="100"
AllowDrop="False" InputScope="AlphanumericFullWidth"
Text="{x:Bind Value, Mode=TwoWay, Converter={StaticResource engrConverter}, ConverterParameter={Binding AllowNegativeNumber, Mode=OneTime} }"/>
</Grid>
</UserControl>
下面是关联的CS
public sealed partial class EngrNumberBox : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public EngrNumber Value
{
get { return (EngrNumber)GetValue(ValueProperty); }
set
{
SetValue(ValueProperty, value);
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value"));
}
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value",
typeof(EngrNumber), typeof(EngrNumberBox), new PropertyMetadata(EngrNumber.one()));
public bool AllowNegativeNumber
{
get { return (bool)GetValue(AllowNegativeNumberProperty); }
set
{
SetValue(AllowNegativeNumberProperty, value);
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("AllowNegativeNumber"));
}
}
public static readonly DependencyProperty AllowNegativeNumberProperty =
DependencyProperty.Register("AllowNegativeNumber",
typeof(bool), typeof(EngrNumberBox), new PropertyMetadata(false));
public EngrNumberBox()
{
this.InitializeComponent();
}
}
还有转换器:
public class EngrConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
//number to string
if (value == null) return "";
EngrNumber engrNumber = (EngrNumber)value;
return engrNumber.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
//string to number
String valueString = (String)value;
if (valueString == "")
return EngrNumber.one();
else
{
EngrNumber output;
try
{
output = EngrNumber.ConvertFromString(valueString);
}
catch { output = EngrNumber.one(); }
bool allowNegativeNumber = (bool)parameter;
if (!allowNegativeNumber) output.makePositiveSign();
return output;
}
}
}
无论我做什么,转换器方法ConvertBack(将字符串转换为数字)始终会得到一个空参数值(因此它会崩溃并发生异常)。我认为问题出在参数的Binding中,尝试了很多事情,但击败了我。 我该怎么办?