Как связать несколько свойств в элементе макета Android
-
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} }"
.