Как связать несколько свойств в элементе макета Android

StackOverflow https://stackoverflow.com//questions/10688603

  •  12-12-2019
  •  | 
  •  

Вопрос

Я использую MvvmCross для привязки данных моей ViewModel к макету представления Android.

Из примера 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 в массив.

Это было полезно?

Решение

Формат JSON, используемый в выражении привязки, представляет собой словарь именованных MvxJsonBindingОписаниес

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 уровня активности/представления DataContext является ViewModel, но для 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);
    }
}

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


Одним из примеров, демонстрирующих работу нескольких привязок, является BestSellers — см. раздел «Клик и привязка текста» в элементе списка. https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20BestSellers/BestSellers/BestSellers.Droid/Resources/Layout/ListItem_Category.axml

Другие советы

Путь ':' hishloweryou должен сделать это:

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

Примечание:

bind="{ 'Text':{xx}, 'Other':{yy} }"
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top