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

标签 ios data-binding mvvmcross

我为电话号码输入子类化了一个 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/

相关文章:

ios - MvvmCross - 如何将 UIView.Layer.AnyProperty (Xamarin.iOS) 绑定(bind)到 View 模型上的属性?

android - 在 iOS 中定义 UITableView Cell 模板的简单方法类似于在 Android 中使用 MvxListView 完成的方式

ios - 自动调整 UITableView 高度以仅显示存在的 UITableViewCell

ios - 在 iOS 中从 Google Analytics 迁移到 Firebase

android - 从 FragmentScenario 设置要从 DataBindingIdlingResource 使用的 fragment 的问题

c# - 数据绑定(bind)后 telerik radgrid 的客户端绑定(bind)未更新

c# - 从 View 模型导航到mvvmcross中的另一个 View 模型时崩溃

ios - Restkit,禁用缓存

ios - REST 上传文件大小限制和超时

c# - 代码隐藏中的数据绑定(bind)