Comment puis-je lier plusieurs propriétés dans un élément de mise en page Android
-
12-12-2019 - |
Question
J'utilise MVVMCross à Databind My ViewModel à une mise en page d'une vue Android.
de l'exemple SimpleBinding, je peux voir que pour lier une valeur à une propriété que je fais ceci:
<EditText
android:hint="Subtotal"
android:gravity="left"
android:inputType="numberDecimal"
android:maxLines="1"
android:numeric="decimal"
local:MvxBind="{'Text':{'Path':'SubTotal','Converter':'Float'}}"
/>
Donc, le texte est lié à la propriété sous-totale de la vue de la vue.Mais comment puis-je lier plus d'une propriété?Dans mon cas, je veux lier une propriété ViewModel appelée HideLowower à l'attribut TextColor de l'élément de mise en page.Je ne peux pas ajouter un autre mvxbind et je ne peux pas régler MVXBind à un tableau.
La solution
Le format du JSON utilisé dans l'expression de liaison est un dictionnaire de nommé 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; }
}
Ceci est utilisé avec:
- Le nom de la clé de dictionnaire étant la propriété cible (vue) pour la liaison.
- La propriété Genering
Path
étant la propriété Source (DataContext) pour la liaison - SiPath
n'est pas spécifié, l'ensemble du DataContext lui-même est la source de liaison.
Pour l'activité / le niveau d'affichage AXML, le DataContext est le point de vue de la vue - mais pour Sous-View AXML, le DataContext sera normalement un objet enfant de la viewModel - E. G. Dans une liste de réalisations, le DataContext peut être un élément à l'intérieur d'une liste ou d'une observablecollection appartenant à la vue.
Pour spécifier plusieurs liaisons, vous pouvez utiliser JSON comme:
{
'TargetProperty1':{'Path':'SourceProperty1'},
'TargetProperty2':{'Path':'SourceProperty2'}
}
Pour votre exemple particulier, cela pourrait être:
local:MvxBind="
{
'Text':{'Path':'SubTotal','Converter':'Float'},
'TextColor':{'Path':'HigherLower','Converter':'MyColorConverter'}
}"
Où votre viewmodel est quelque chose comme:
public class MyViewModel : IMvxViewModel
{
public float SubTotal { get; set; }
public bool HigherLower { get; set; }
// more code here
}
et votre convertisseur est quelque chose comme:
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);
}
}
et où ce convertisseur est initialisé lors de la configuration - par exemple. Voir comment les propriétés du Les convertisseurs classe sont utilisés dans twittersarch
Un échantillon indiquant plusieurs liaisons au travail est les best-sellers - voir clic et texte lié dans l'élément de la liste https://github.com/slodge/mvvmcross/blob/master/sample%20-%20BestSellers/bestSellers/BestSellers.droïd/ Ressources / mise en page / listitem_category.axml
Autres conseils
Chemin ':' La Had Hadloweryou doit faire ceci:
local:MvxBind="{'Text':{'Path':'SubTotal','Converter':'Float'}, 'TextColor':{'Path':'HigherLower','Converter':'Color'}}"
NOTEZ LA:
bind="{ 'Text':{xx}, 'Other':{yy} }"