Как связать несколько свойств в элементе макета 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, используемый в выражении привязки, представляет собой словарь с именем MvxJsonBindingDescription

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 сам является источником привязки.

Для axml уровня Activity/View 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);
    }
}

и где этот преобразователь инициализируется во время установки - например. посмотрите, как свойства Преобразователи используются в Поиск в Твиттере


Одним из примеров, показывающих несколько привязок в работе, является BestSellers — см. Привязка кликов и текста в элементе списка 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