用我的默认 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 中提供了有关初始化/设置顺序的更多信息(正在进行中)。
如何使用绑定语法为 Text 指定不同的绑定?
行:
registry.RegisterPropertyInfoBindingFactory(
typeof (UITextFieldTextDidEndTargetBinding),
typeof (UITextField),
"DidEndText");
不起作用,因为它尝试使用名为 DidEndText 的属性 - 该属性不存在。
解决此问题的两种可能方法是:
1 个子类UITextField 提供不动产
public class MyTextField : UITextField
{
// ctors
public string MySpecialText
{
get { return base.Text; }
set { base.Text = value; }
}
}
UITextField 子类化的示例显示在the N=33 video 中
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 正在处理金钱,这可能会坚持显示所有值的小数位。