UITextField.text的双向绑定未更新

时间:2014-04-26 07:15:02

标签: c# ios mvvmcross

当我手动更改UITextField.Text"的内容时,更改不会反映到viewmodel中 - 不会调用setter方法。

在我的视图模型中

private string _amount;
public string Amount
{
  get { return _amount; }
  set { _amount = value; RaisePropertyChanged(() => Amount); }
}

在我看来

var _amount = new UITextField() { TranslatesAutoresizingMaskIntoConstraints = false };
View.AddSubview(_amount);
var set = this.CreateBindingSet<View, core.ViewModels.ViewModel>();
set.Bind(_amount).To(vm => vm.Amount);
set.Apply();
_amount.Text = "something";

视图模型中的金额未更新,但如果我键入&#34;某些内容&#34;在此文本字段中,然后更新viewmodel。

我试过

_amount.WillChangeValue("Text");
_amount.Text = "something";
_amount.DidChangeValue("Text");

但这确实有效。

视图如何告诉mvvmcross该字段已更新?

编辑:通过自定义绑定解决,通过观察者监听UITextField更改。

1 个答案:

答案 0 :(得分:5)

MvvmCross使用来自objC的委托/事件Text绑定到EditingChanged - 请参阅https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding.Touch/Target/MvxUITextFieldTextTargetBinding.cs#L54 - 这就是更改文本时不会触发事件的原因。

解决这个问题的一种方法是使用继承控件和新属性 - 例如

 [Register("MyTextField")]
 public class MyTextField : UITextField
 {
     public MyTextField() {
        HookEvent();
     }

     public MyTextField(IntPtr ptr) {
        HookEvent();
     }

     // other ctors as needed

     private void HookEvent() {
        EditingChanged += (s, e) => MyTextChanged.Raise(this);
     }

     public string MyText {
        get { return Text; }
        set { Text = value; MyTextChanged.Raise(this); }
     }

     public event EventHandler MyTextChanged;
 }

这样您就可以使用MyTextField代替UITextFieldMyText代替Text