¿Cómo vinculo múltiples propiedades en un elemento de diseño de Android?
-
12-12-2019 - |
Pregunta
Estoy usando MVVMCross para Databind My ViewModel a un diseño de vista Android.
del ejemplo de SimpleBinding Puedo ver que para unir un valor a una propiedad, hago esto:
<EditText
android:hint="Subtotal"
android:gravity="left"
android:inputType="numberDecimal"
android:maxLines="1"
android:numeric="decimal"
local:MvxBind="{'Text':{'Path':'SubTotal','Converter':'Float'}}"
/>
El texto está unido a la propiedad subtotal de ViewModel.Pero, ¿cómo voy a más de una propiedad?En mi caso, quiero unir una propiedad ViewModel llamada SuppassLower al atributo TextColor del elemento de diseño.No puedo agregar otro MVXBind y no puedo configurar MVXBind a una matriz.
Solución
El formato del JSON utilizado en la expresión de enlace es un diccionario de llamado mvxjsonbindingdescription s
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; }
}
Esto se usa con:
- El nombre de la clave del diccionario es la propiedad de destino (vista) para la encuadernación.
- La propiedad de generación de vinculación de la propiedad (DataContext) es la propiedad de la fuente (DataContext) para el enlace: si no se especifica
Path
, entonces toda la propia DataContext es la fuente de unión.
Para la actividad / Vista a nivel AXML El DataContext es el ViewModel, pero para AXML de Sub-View, el DataContext normalmente será un objeto secundario del ViewModel - E.G. Dentro de un ListView, el DataContext podría ser un elemento dentro de una lista o la selección de observabilidad propiedad de ViewModel.
Para especificar enlaces múltiples, puede usar JSON como:
{
'TargetProperty1':{'Path':'SourceProperty1'},
'TargetProperty2':{'Path':'SourceProperty2'}
}
Para su ejemplo particular, esto podría ser:
local:MvxBind="
{
'Text':{'Path':'SubTotal','Converter':'Float'},
'TextColor':{'Path':'HigherLower','Converter':'MyColorConverter'}
}"
Donde su visualdel es algo así como:
public class MyViewModel : IMvxViewModel
{
public float SubTotal { get; set; }
public bool HigherLower { get; set; }
// more code here
}
y su convertidor es algo así como:
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);
}
}
y donde ese convertidor se inicializa durante la instalación - por ejemplo. Vea cómo las propiedades de la Los convertidores clase se utilizan en TwitterSearch
Una muestra que muestra múltiples enlaces en el trabajo es los mejores ventas: consulte el clic y el texto encuadernado en el elemento de la lista https://github.com/slodge/mvvmcross/blob/master/sample%20-%20bestsellers/bestsellers/bestsellers.droid/ Recursos / Diseño / LISTITEM_CATEGORY.AXML
Otros consejos
Ruta ':' MayorLOWERYOU debe hacer esto:
local:MvxBind="{'Text':{'Path':'SubTotal','Converter':'Float'}, 'TextColor':{'Path':'HigherLower','Converter':'Color'}}"
NOTA EL:
bind="{ 'Text':{xx}, 'Other':{yy} }"