2

我在 MvvmCross 中使用流利的语法和 lambdas 进行数据绑定。这方面的一个例子是:

var bindings = this.CreateBindingSet<MyTableCell, MyTableCellViewModel>();
bindings.Bind(titleLabel).To(vm => vm.MY_TITLE);
bindings.Apply();

每当我在视图模型属性中使用下划线尝试此操作时,都会出现异常:

Cirrious.CrossCore.Exceptions.MvxException:targetProperty 文本 MY_TITLE 中位置 3 的意外字符 _

我相信错误消息是 MvvmCross 解析数据绑定的结果,但这似乎只对使用基于字符串的数据绑定的人有意义,而不是 lambda 表达式语法。

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

4

1 回答 1

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;
     }
 }
于 2013-10-14T16:34:13.890 回答