MvvmCross数据绑定中的下划线

时间:2013-10-14 16:05:00

标签: mvvmcross

我在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表达式语法。

不幸的是,我无法更改视图模型,所以我正在寻找一种解决方法,允许在视图模型中使用下划线。有什么想法吗?

1 个答案:

答案 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));
    }

https://github.com/MvvmCross/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding/Parse/PropertyPath/MvxSourcePropertyPathParser.cs#L80

可能需要将其修复为:

        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;
     }
 }