2013-10-14 46 views
2

我在MvvmCross中使用流暢的語法和lambda表達式進行數據綁定。這方面的一個例子是:MvvmCross數據綁定中的下劃線

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

每當我嘗試這與在視圖模型屬性下劃線我得到一個異常:

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

我相信錯誤消息是MvvmCross解析數據綁定的結果,然而這似乎是使用基於字符串的數據綁定,只讓人們感覺,而不是拉姆達表達式語法。

不幸的是,我無法更改視圖模型,因此我正在尋找解決方法以允許視圖模型中的下劃線。有任何想法嗎?

回答

2

我猜這是在MvvmCross解析器的一個普遍問題 - 在https://github.com/MvvmCross/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding/Parse/PropertyPath/MvxSourcePropertyPathParser.cs#L80

大概在

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

我對源代碼進行了修正(並進行了測試以確保它不會再次中斷) - 請參閱提交鏈接到https://github.com/MvvmCross/MvvmCross/issues/461 – Stuart

+0

非常感謝,斯圖爾特!輝煌,一如既往,一個令人難以置信的響應時間。 – kwl

+0

它似乎修復不解決以下劃線開頭的變量(我知道,我們有瘋狂的視圖模型)。這個問題似乎在'ParseNextToken'中。 – kwl