2013-10-14 3 views
2

Я использую свободный синтаксис и lambdas для привязки данных в MvvmCross. Примером этого является:Подчеркивания в привязке данных 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 - вероятно, в

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

Я исправил исходный код (и тест, чтобы убедиться, что он не сломается снова) - см. Фиксацию, связанную с https://github.com/MvvmCross/MvvmCross/issues/461 – Stuart

+0

Большое вам спасибо, Стюарт! Блестяще, как всегда, и невероятное время отклика. – kwl

+0

Похоже, что исправление не относится к переменным, начинающимся с подчеркивания (я знаю, у нас сумасшедшие модели взглядов). Проблема, похоже, в 'ParseNextToken'. – kwl

Смежные вопросы