绑定的ConverterParameter在转换器处始终为空

时间:2018-08-16 14:54:15

标签: c# data-binding uwp

我有一个名为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中,尝试了很多事情,但击败了我。 我该怎么办?

0 个答案:

没有答案
相关问题