gpt4 book ai didi

MVVMCross 绑定(bind)小数到 UITextField 删除小数点

转载 作者:行者123 更新时间:2023-12-03 10:21:37 26 4
gpt4 key购买 nike

将小数绑定(bind)到 UITextField 不会让您放置“。”在中,当您键入“1.”时,对源的推送会将其删除。我明白为什么会发生这种情况,MakeSafeValue 将其转换为小数,在没有“。”的情况下读回,覆盖输入的文本。这似乎是一个 keyup 与 onblur 的问题,很多绑定(bind)框架让你覆盖。

我知道我可以在 View 模型上绑定(bind)一个字符串,但是处理 EditingDidEnd 而不是 EditingChanged 似乎更好。这样我就可以拦截 ShouldEndEditing 来检查有效性。

我将在哪里注册我的绑定(bind)以覆盖 MvvmCross 实现?我尝试在我的 Setup.FillTargetFactories 中添加,但它是在 MvvmCross 所在的 MVXTouchBindingBuilder.FillTargetFactories 之前调用的。

我尝试了一个不同的属性名称,在 FillTargetFactories 我有:

registry.RegisterPropertyInfoBindingFactory(typeof (UITextFieldTextDidEndTargetBinding), typeof (UITextField), "DidEndText");

但是当我绑定(bind)时它不起作用。
set.Bind(textField).For("DidEndText").To(vm => vm.GMoney);

如果目标没有该属性 = 有意义,则看起来 MvxPropertyInfoTargetBindingFactory.CreateBinding 不起作用。这是否让我从 MvxTargetBinding 开始并创建自定义绑定(bind)?我讨厌在 MvxPropertyInfoTargetBinding 中重新创建大部分代码。

所以,我想问题是......
  • 用我的默认 UITextField 绑定(bind)覆盖的语法/位置是什么?
  • 如何使用 Bind 语法为 Text 指定不同的绑定(bind)?

  • 提前致谢。

    最佳答案

    what is the syntax/location to override the default UITextField binding with mine?



    如果你想简单地替换现有的绑定(bind),那么你可以通过 RegisterPropertyInfoBindingFactory 来完成。扩展方法。

    MvvmCross 运行一个简单的“最后注册获胜”系统。

    按照最后发生的顺序,最简单的方法是将其放在 InitializeLastChance 的末尾。在您的 Setup :
     protected override void InitializeLastChance()
    {
    base.InitializeLastChance();

    var factory = base.Resolve<IMvxTargetBindingFactoryRegistry>();
    factory.RegisterPropertyInfoBindingFactory(
    typeof(MyBindingType),
    typeof(UITextField),
    "Text");
    }

    https://github.com/slodge/MvvmCross/wiki/Customising-using-App-and-Setup 中有更多关于初始化/设置顺序的信息。 (工作正在进行中)。

    how can I specify a different binding for Text with the Bind Syntax?



    该行:
         registry.RegisterPropertyInfoBindingFactory(
    typeof (UITextFieldTextDidEndTargetBinding),
    typeof (UITextField),
    "DidEndText");

    不起作用,因为它试图使用一个名为 DidEndText 的属性- 不存在。

    解决此问题的两种可能方法是:

    1 个子类 UITextField提供不动产
       public class MyTextField : UITextField
    {
    // ctors

    public string MySpecialText
    {
    get { return base.Text; }
    set { base.Text = value; }
    }
    }
    UITextField 的示例子类化显示在 the N=33 video

    2 或使用非基于propertyInfo 的绑定(bind)

    对于已知的属性和事件对,这很简单:
    public class MySpecialBinding : MvxTargetBinding
    {
    public MySpecialBinding (UIEditField edit)
    : base(edit)
    {
    edit.SpecialEvent += Handler;
    }

    protected override void Dispose(bool isDisposing)
    {
    if (isDisposing)
    {
    var text = (UITextField)Target;
    if (text != null)
    {
    text.SpecialEvent -= Handler;
    }
    }
    base.Dispose(isDisposing);
    }

    protected override void Handler(object s, EventArgs e)
    {
    var text = (UITextField)target;
    if (text == null)
    return;
    FireValueChanged(text.Text);
    }

    public override MvxBindingMode DefaultMode
    {
    get { return MvxBindingMode.TwoWay; }
    }

    public override Type TargetType
    {
    get { return typeof(string); }
    }

    public override void SetValue(object value)
    {
    var text = (UITextField)target;
    if (text == null)
    return;
    text.Text = value;
    }
    }

    可以使用 RegisterCustomBindingFactory 注册此特殊绑定(bind)。
    registry.RegisterCustomBindingFactory<UITextField>(
    "FooFlipper",
    textField => new MySpecialBinding(textField));

    之后绑定(bind)如下:
    set.Bind(textField).For("FooFlipper").To(vm => vm.GMoney);

    将工作。

    除了您的“在 ViewModel 中使用字符串”建议之外,这种双文本转换的另一种可能的解决方法可能是使用双向值转换器。如果您的 UI 正在处理金钱,这可能会坚持显示所有值的小数位。

    关于MVVMCross 绑定(bind)小数到 UITextField 删除小数点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17603755/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com