Ios 使用ShouldChangeCharacters会中断mvvmcross数据绑定

Ios 使用ShouldChangeCharacters会中断mvvmcross数据绑定,ios,data-binding,mvvmcross,Ios,Data Binding,Mvvmcross,我为电话号码输入子类化了UITextField,并为ShouldChangeCharacters添加了一个委托,以确保输入是ddd格式的。我自动插入破折号并处理退格以包含破折号 我直接修改字段文本,并始终从委托返回false this.ShouldChangeCharacters = (field, range, replacementString) => { int oldLength = field.Text.Length;

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

我直接修改字段文本,并始终从委托返回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;
        };
未在我的视图模型中设置Phone属性

是否仍有方法确保通过数据绑定查看对UITextField文本属性的更改?

这里的问题(我认为)是返回
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,并可以使用以下内容进行绑定:

set.Bind(cleanTextPhone).For(v => v.CleanText).To(vm => vm.Phone);

如果要使用较小的表达式(不使用
For
),则需要添加
CleanText
作为
MyField
的默认绑定属性,更简单的方法是在设置文本后执行以下操作

myTextField.SendActionForControlEvents(UIControlEvent.EditingChanged);
这一回答值得赞扬:

UIControlEvent.editingdidend我不了解您发表评论的原因。这是对你的答案的补充还是更正?本来应该是更正,但它是不正确的。EditingChanged是这种情况下的正确答案。
myTextField.SendActionForControlEvents(UIControlEvent.EditingChanged);