我在MvvmCross中使用流畅的语法和lambdas进行数据绑定。一个例子是:
var bindings = this.CreateBindingSet<MyTableCell, MyTableCellViewModel>();
bindings.Bind(titleLabel).To(vm => vm.MY_TITLE);
bindings.Apply();
每当我在视图模型属性中使用下划线尝试此操作时,我都会遇到异常:
Cirrious.CrossCore.Exceptions.MvxException:意外的字符_ at targetProperty文本MY_TITLE中的位置3
我认为错误消息是MvvmCross解析数据绑定的结果,但这似乎只适用于使用基于字符串的数据绑定的人,而不是lambda表达式语法。
不幸的是,我无法更改视图模型,所以我正在寻找一种解决方法,允许在视图模型中使用下划线。有什么想法吗?
答案 0 :(得分:2)
我猜这是MvvmCross解析器中的一般问题 - 可能在
中 private void ParsePropertyName()
{
var propertyText = new StringBuilder();
while (!IsComplete && char.IsLetterOrDigit(CurrentChar))
{
propertyText.Append(CurrentChar);
MoveNext();
}
var text = propertyText.ToString();
CurrentTokens.Add(new MvxPropertyNamePropertyToken(text));
}
中
可能需要将其修复为:
while (!IsComplete &&
(char.IsLetterOrDigit(CurrentChar) || CurrentChar == '_')
您可以使用解决方法,但最简单的解决方案可能是修复此问题并重建,而不是尝试解决方法。
但如果你想尝试解决方法......
假设这是静态(不变)文本,这只是一次性的,那么一个解决方法可能是向您的单元格添加一个名为Hack
的属性,然后绑定如下:
bindings.Bind(this).For(v => v.Hack).To(vm => vm);
//...
private MyTableCellViewModel _hack;
public MyTableCellViewModel Hack
{
get { return _hack; }
set { _hack = value; if (_hack != null) titleLabel.Text = _hack.MY_VALUE; }
}
另一种选择(使用相同的假设)可能是使用值转换器 -
bindings.Bind(titleLabel).To(vm => vm.MY_TITLE).WithConversion(new WorkaroundConverter(), null);
// ...
public class WorkaroundConverter : MvxValueConverter<MyTableCellViewModel, string>
{
protected override string Convert(MyTableCellViewModel vm, /*...*/)
{
if (vm == null) return null;
return vm.MY_TITLE;
}
}