Как да обвържа множество свойства в елемент на оформление на Android

Използвам MvvmCross, за да обвържа данни с моя ViewModel към Android View оформление.

От примера SimpleBinding мога да видя, че за да обвържа стойност към свойство, правя следното:

  <EditText
    android:hint="Subtotal"
    android:gravity="left"
    android:inputType="numberDecimal"
    android:maxLines="1"
    android:numeric="decimal"        
    local:MvxBind="{'Text':{'Path':'SubTotal','Converter':'Float'}}"
  />

така че Text е обвързан със свойството SubTotal на ViewModel. Но как да се свържа с повече от едно свойство? В моя случай искам да свържа свойство ViewModel, наречено HigherLower, към атрибута TextColor на елемента на оформлението. Не мога да добавя друг MvxBind и не мога да настроя MvxBind на масив.


person Jason Steele    schedule 21.05.2012    source източник
comment
Можете да разгледате примера в тази публикация в блога: casseykeating.com/ home/2017/6/26/conversion-bindings   -  person cfl    schedule 03.07.2017


Отговори (2)


Форматът на JSON, използван в израза за обвързване, е речник на име MvxJsonBindingDescriptions

public class MvxJsonBindingDescription
{
    public string Path { get; set; }
    public string Converter { get; set; }
    public string ConverterParameter { get; set; }
    public string FallbackValue { get; set; }
    public MvxBindingMode Mode { get; set; }
}

Това се използва с:

  • името на речниковия ключ е целевото (Изглед) свойство за обвързването.
  • свързващото свойство Path е свойството източник (DataContext) за обвързването - ако Path не е указано, тогава целият DataContext е самият източник на обвързване.

За ниво Activity/View axml DataContext е ViewModel - но за sub-View axml тогава DataContext обикновено ще бъде дъщерен обект на ViewModel - напр. вътре в ListView DataContext може да бъде елемент в List или ObservableCollection, притежаван от ViewModel.


За да укажете множество обвързвания, можете да използвате JSON като:

 {
      'TargetProperty1':{'Path':'SourceProperty1'},
      'TargetProperty2':{'Path':'SourceProperty2'}
 }

За вашия конкретен пример това може да бъде:

local:MvxBind="
       {
          'Text':{'Path':'SubTotal','Converter':'Float'}, 
          'TextColor':{'Path':'HigherLower','Converter':'MyColorConverter'}
       }"

където вашият ViewModel е нещо като:

public class MyViewModel : IMvxViewModel
{
     public float SubTotal { get; set; }

     public bool HigherLower { get; set; }

     // more code here
}

и вашият конвертор е нещо като:

public class MyColorConverter : MvxBaseColorConverter
{
    protected override MvxColor Convert(object value, object parameter, CultureInfo culture)
    {
        return ((bool)value) ? new MvxColor(255,0,0) : new MvxColor(0,255,0);
    }
}

и къде този конвертор се инициализира по време на настройка - напр. вижте как свойствата на Класът Converters се използва в TwitterSearch


Една проба, която показва множество обвързвания в действие, е Bestsellers - вижте Click and Text bounded в елемента от списъка https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20BestSellers/BestSellers/BestSellers.Droid/Resources/Layout/ListItem_Category.axml

person Stuart    schedule 21.05.2012
comment
Благодаря, това работи, но срещнахме проблем. няма свойство TextColor. Има свойство TextColors само за четене и метод SetTextColor(). Това очевидно затруднява свързването на данни. Някакви предположения? (Мога да повдигна като друга публикация SO, ако смятате, че си заслужава) - person Jason Steele; 22.05.2012
comment
да - това ще изисква по-дълго обяснение, отколкото мога да направя в коментар... вие гледате как да направя персонализирани свойства за свързване! Не е лошо за кодиране, но е малко умствено за четене :) - person Stuart; 22.05.2012
comment
Публикувах отново тук stackoverflow.com/questions/10700445/ - person Jason Steele; 22.05.2012

Path':'HigherLowerТрябва да направите това:

local:MvxBind="{'Text':{'Path':'SubTotal','Converter':'Float'}, 'TextColor':{'Path':'HigherLower','Converter':'Color'}}"

Обърнете внимание на:

bind="{ 'Text':{xx}, 'Other':{yy} }"
person Matthew    schedule 21.05.2012
comment
+1 благодаря! Да, нормално е Json - пример за множество свързвания в действие на github.com/slodge/MvvmCross/blob/master/ - person Stuart; 21.05.2012
comment
всъщност - не съвсем точно сега, прочетох го отново... второто ти подвързване е изключено. Ще обясни в отговор - person Stuart; 21.05.2012
comment
@Stuart Какво не беше наред с второто обвързване? Ако имате предвид 'Text':{xx}, xx е просто заместител за обвързващата информация. - person Matthew; 22.05.2012
comment
Съжалявам за объркването - имах предвид, че има проблем във второто обвързване в първия раздел на кода. 'TextColor':'SubTotal' е грешната част - не съответства на JSON структурата, която очаква свойства на Path, Converter и т.н. - person Stuart; 22.05.2012
comment
@Stuart О, добре, грешно копирах и поставих текста... Ще редактирам. Моя грешка. - person Matthew; 22.05.2012