Xamarin.forms Xamarin限制输入字段的小数位数

Xamarin.forms Xamarin限制输入字段的小数位数,xamarin.forms,Xamarin.forms,我在集合视图单元格中有一个输入字段。输入字段应只接受带特定小数点的数值。如果超过小数点,我不想再输入更多的内容。每个单元格的小数位数各不相同。如何在模型中或使用行为/触发器创建此验证 目前,我的代码是这样的 <Entry Placeholder="Quantity" Keyboard="Numeric" Text="{Binding EnteredQuantity, Mode=TwoWay}"/>

我在集合视图单元格中有一个输入字段。输入字段应只接受带特定小数点的数值。如果超过小数点,我不想再输入更多的内容。每个单元格的小数位数各不相同。如何在模型中或使用行为/触发器创建此验证

目前,我的代码是这样的

<Entry Placeholder="Quantity"
       Keyboard="Numeric"
       Text="{Binding EnteredQuantity, Mode=TwoWay}"/>
对于上述测试,格式字符串为{0:0.##},小数点为2。 我试图限制Binding属性中的值。然而,这并不反映在前端。前端将显示任何小数位,如下图所示。有人知道如何解决这个问题吗


是否使用行为来实现此目标

Xaml代码

...
xmlns:local="clr-namespace:DummyTestApp"
...
<Entry HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand">
     <Entry.Behaviors>
            <local:LengthValidateBehavior MaxLength="7"/>
     </Entry.Behaviors>
</Entry>
。。。
xmlns:local=“clr命名空间:DummyTestApp”
...
行为类

public class LengthValidateBehavior : Behavior<Entry>
    {
        public static BindableProperty MaxLengthProperty = BindableProperty.Create(nameof(MaxLength), typeof(int), typeof(LengthValidateBehavior), 5/* default value*/);

        public int MaxLength
        {
            get
            {
                return (int)GetValue(MaxLengthProperty);
            }
            set
            {
                SetValue(MaxLengthProperty, value);
            }
        }


        protected override void OnAttachedTo(Entry entry)
        {
            entry.TextChanged += OnEntryTextChanged;
            base.OnAttachedTo(entry);
        }

        protected override void OnDetachingFrom(Entry entry)
        {
            entry.TextChanged -= OnEntryTextChanged;
            base.OnDetachingFrom(entry);
        }

        void OnEntryTextChanged(object sender, TextChangedEventArgs args)
        {
            if (sender is Entry entry)
            {
                if (args.NewTextValue.Length > MaxLength)// write your logic here
                {
                    entry.Text = args.OldTextValue;
                }
            }
        }
    }

公共类长度验证行为:行为
{
public static BindableProperty MaxLengthProperty=BindableProperty.Create(nameof(MaxLength)、typeof(int)、typeof(LengthValidateBehavior)、5/*默认值*/);
公共整数最大长度
{
得到
{
返回(int)GetValue(MaxLengthProperty);
}
设置
{
SetValue(MaxLengthProperty,值);
}
}
受保护的覆盖无效附加到(条目)
{
entry.TextChanged+=OnEntryTextChanged;
基本数据(条目);
}
受保护的覆盖无效OnDetachingFrom(条目)
{
entry.TextChanged-=OnEntryTextChanged;
base.OnDetachingFrom(条目);
}
void OnEntryTextChanged(对象发送方,textchangedventargs args)
{
如果(发件人是条目)
{
if(args.NewTextValue.Length>MaxLength)//在此处编写逻辑
{
entry.Text=args.OldTextValue;
}
}
}
}

同样,根据您自己的要求使用您自己的逻辑来限制输入。

如何传递小数点和值到值转换器?我的小数位也是动态的。对不起,我不知道它是动态的。谢谢你的回复。这就是我一直在照顾的。
public class LengthValidateBehavior : Behavior<Entry>
    {
        public static BindableProperty MaxLengthProperty = BindableProperty.Create(nameof(MaxLength), typeof(int), typeof(LengthValidateBehavior), 5/* default value*/);

        public int MaxLength
        {
            get
            {
                return (int)GetValue(MaxLengthProperty);
            }
            set
            {
                SetValue(MaxLengthProperty, value);
            }
        }


        protected override void OnAttachedTo(Entry entry)
        {
            entry.TextChanged += OnEntryTextChanged;
            base.OnAttachedTo(entry);
        }

        protected override void OnDetachingFrom(Entry entry)
        {
            entry.TextChanged -= OnEntryTextChanged;
            base.OnDetachingFrom(entry);
        }

        void OnEntryTextChanged(object sender, TextChangedEventArgs args)
        {
            if (sender is Entry entry)
            {
                if (args.NewTextValue.Length > MaxLength)// write your logic here
                {
                    entry.Text = args.OldTextValue;
                }
            }
        }
    }