用我的默认 UITextField 绑定覆盖的语法/位置是什么?
如果你想简单地替换现有的绑定,那么你可以通过RegisterPropertyInfoBindingFactory
扩展方法来做到这一点。
MvvmCross 运行一个简单的“最后注册获胜”系统。
最简单的将您的注册放在最后发生的顺序是将其放在InitializeLastChance
您的末尾Setup
:
protected override void InitializeLastChance()
{
base.InitializeLastChance();
var factory = base.Resolve<IMvxTargetBindingFactoryRegistry>();
factory.RegisterPropertyInfoBindingFactory(
typeof(MyBindingType),
typeof(UITextField),
"Text");
}
在https://github.com/slodge/MvvmCross/wiki/Customising-using-App-and-Setup中有更多关于初始化/设置顺序的信息(正在进行中)。
如何使用 Bind 语法为 Text 指定不同的绑定?
该行:
registry.RegisterPropertyInfoBindingFactory(
typeof (UITextFieldTextDidEndTargetBinding),
typeof (UITextField),
"DidEndText");
不起作用,因为它尝试使用名为DidEndText
- 的属性,该属性不存在。
解决此问题的两种可能方法是:
1UITextField
提供不动产的子类
public class MyTextField : UITextField
{
// ctors
public string MySpecialText
{
get { return base.Text; }
set { base.Text = value; }
}
}
N=33 视频UITextField
中显示了子类化的示例
2 或使用非基于propertyInfo 的绑定
对于已知的属性和事件对,这很简单:
public class MySpecialBinding : MvxTargetBinding
{
public MySpecialBinding (UIEditField edit)
: base(edit)
{
edit.SpecialEvent += Handler;
}
protected override void Dispose(bool isDisposing)
{
if (isDisposing)
{
var text = (UITextField)Target;
if (text != null)
{
text.SpecialEvent -= Handler;
}
}
base.Dispose(isDisposing);
}
protected override void Handler(object s, EventArgs e)
{
var text = (UITextField)target;
if (text == null)
return;
FireValueChanged(text.Text);
}
public override MvxBindingMode DefaultMode
{
get { return MvxBindingMode.TwoWay; }
}
public override Type TargetType
{
get { return typeof(string); }
}
public override void SetValue(object value)
{
var text = (UITextField)target;
if (text == null)
return;
text.Text = value;
}
}
这个特殊绑定可以使用注册RegisterCustomBindingFactory
registry.RegisterCustomBindingFactory<UITextField>(
"FooFlipper",
textField => new MySpecialBinding(textField));
之后绑定如下:
set.Bind(textField).For("FooFlipper").To(vm => vm.GMoney);
将工作。
除了您的“在 ViewModel 中使用字符串”建议外,这种双文本转换的另一种可能的解决方法可能是使用双向值转换器。如果您的 UI 正在处理金钱,这可能会坚持显示所有值的小数位。