当我“手动”更改 UITextField.Text 的内容时,更改不会反射(reflect)到 View 模型中 - 不会调用 setter 方法。
在我的 View 模型中
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";
View 模型中的数量没有更新,但如果我在此文本字段中键入“某物”,则 View 模型会更新。
我试过了
_amount.WillChangeValue("Text");
_amount.Text = "something";
_amount.DidChangeValue("Text");
但这没有用。
View 如何告诉 mvvmcross 字段已更新?
编辑:通过自定义绑定(bind)通过观察者监听 UITextField 更改来解决。
最佳答案
MvvmCross 使用来自 objC 的委托(delegate)/事件 EditingChanged
绑定(bind)到 Text
- 参见 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
关于c# - UITextField.text 的双向绑定(bind)不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23307911/