【问题标题】:Underscores in MvvmCross data bindingMvvmCross 数据绑定中的下划线
【发布时间】:2013-10-14 16:05:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: mvvmcross


    【解决方案1】:

    我猜这是 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;
         }
     }
    

    【讨论】:

    • 我对源代码进行了修复(并进行了测试以确保它不会再次中断) - 请参阅链接到github.com/MvvmCross/MvvmCross/issues/461的提交
    • 非常感谢,斯图尔特!一如既往的出色,而且响应时间令人难以置信。
    • 看来修复没有解决以下划线开头的变量(我知道,我们有疯狂的视图模型)。问题似乎出在ParseNextToken
    猜你喜欢
    • 2015-07-04
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多