gpt4 book ai didi

ios - 使用 ShouldChangeCharacters 中断 mvvmcross 数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 16:42:50 25 4
gpt4 key购买 nike

我为电话号码输入子类化了一个 UITextField,并为 ShouldChangeCharacters 添加了一个委托(delegate),以确保输入采用 ddd-ddd-dddd 格式。我自动插入破折号并处理退格以包含破折号。

我直接修改字段文本并始终从委托(delegate)返回 false。

        this.ShouldChangeCharacters = (field, range, replacementString) =>
{
int oldLength = field.Text.Length;
int replacementLength = replacementString.Length;
int rangeLength = range.Length;
int newLength = oldLength - rangeLength + replacementLength;
if (newLength <= 12)
{
if (replacementLength == 0)
{
if (field.Text.EndsWith("-"))
field.Text = field.Text.Substring(0, field.Text.Length - 2);
else
field.Text = field.Text.Substring(0, field.Text.Length - 1);

}
else
{
int digit = 0;
if (int.TryParse(replacementString, out digit))
{
field.Text = field.Text + replacementString;
if (newLength == 3 || newLength == 7)
field.Text = field.Text + "-";
}
}
}
return false;
};

我遇到的问题是这似乎绕过了 mvvmcross 数据绑定(bind)。在我的绑定(bind)集中(在 View 中)我使用了:
set.Bind(textPhone).To(vm => vm.Phone);

我的 View 模型中没有设置 Phone 属性。

无论如何要确保数据绑定(bind)可以看到对 UITextField Text 属性的更改?

最佳答案

这里的问题(我认为)是返回 false防止 EditingChanged触发事件。

要解决这个问题,添加一个新的 UITextField 控件可能是最简单的:

    public class MyField : UITextField
{
public MyField (RectangleF rect)
: base(rect)
{
this.ShouldChangeCharacters = (f, r, r2) => {

// your logic here
this.Text += ".";

var handler = CleanTextChanged;
if (handler != null)
handler(this, EventArgs.Empty);
return false;
};
}

public event EventHandler CleanTextChanged;

public string CleanText {
get { return Text; }
set { Text = value; }
}
}

然后可以使用它代替 UITextField 并且可以使用以下方法进行绑定(bind):
set.Bind(cleanTextPhone).For(v => v.CleanText).To(vm => vm.Phone);

如果您想使用较小的表达式 - 没有 For - 那么你需要添加 CleanText作为 MyField 的默认绑定(bind)属性

关于ios - 使用 ShouldChangeCharacters 中断 mvvmcross 数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22702037/

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