当我手动更改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更改。
答案 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
代替UITextField
和MyText
代替Text