Come posso associare più di una proprietà in un Android elemento di layout
-
12-12-2019 - |
Domanda
Sto usando MvvmCross per databind mio ViewModel per Android e il layout di Visualizzazione.
Dal SimpleBinding esempio posso vedere che per associare un valore a una proprietà faccio questo:
<EditText
android:hint="Subtotal"
android:gravity="left"
android:inputType="numberDecimal"
android:maxLines="1"
android:numeric="decimal"
local:MvxBind="{'Text':{'Path':'SubTotal','Converter':'Float'}}"
/>
un Testo che è legato alla totale Parziale proprietà del ViewModel.Ma come faccio ad associare a più di una proprietà?Nel mio caso voglio associare un ViewModel proprietà denominata HigherLower per Coloretesto attributo dell'elemento di layout.Non posso aggiungere altro MvxBind e non riesco a impostare MvxBind di un array.
Soluzione
Il formato JSON utilizzato in associazione espressione è un Dizionario di nomi MvxJsonBindingDescriptions
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; }
}
Questo è utilizzato per:
- il dizionario nome di Chiave di essere il bersaglio (Vista) di proprietà dell'associazione.
- l'associazione
Path
proprietà di essere la fonte (DataContext) proprietà per l'associazione - sePath
non è specificato quindi tutto il DataContext di per sé è l'origine dell'associazione.
Per Attività/View livello axml DataContext è il ViewModel, ma per sub-Vista axml quindi il DataContext è generalmente un bambino oggetto del ViewModel ad es.all'interno di una ListView DataContext potrebbe essere un elemento all'interno di un Elenco o di una ObservableCollection di proprietà del ViewModel.
Per specificare più associazioni è possibile utilizzare JSON come:
{
'TargetProperty1':{'Path':'SourceProperty1'},
'TargetProperty2':{'Path':'SourceProperty2'}
}
Per il tuo esempio potrebbe essere questo:
local:MvxBind="
{
'Text':{'Path':'SubTotal','Converter':'Float'},
'TextColor':{'Path':'HigherLower','Converter':'MyColorConverter'}
}"
dove il ViewModel è qualcosa di simile a:
public class MyViewModel : IMvxViewModel
{
public float SubTotal { get; set; }
public bool HigherLower { get; set; }
// more code here
}
e il convertitore è qualcosa di simile a:
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);
}
}
e dove convertitore che viene inizializzato durante l'Installazione: ad es.vedere come le proprietà dei Convertitori classe in TwitterSearch
Un esempio che mostra di Più Associazioni al lavoro è un best seller - vedere e fare Clic su Testo associato nella voce di elenco https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20BestSellers/BestSellers/BestSellers.Droid/Resources/Layout/ListItem_Category.axml
Altri suggerimenti
Path ':' AWARELOWERYOUS DEVE FARE QUESTO:
local:MvxBind="{'Text':{'Path':'SubTotal','Converter':'Float'}, 'TextColor':{'Path':'HigherLower','Converter':'Color'}}"
.
Nota il:
bind="{ 'Text':{xx}, 'Other':{yy} }"
.