2017-05-16 3 views
0

J'essaie de changer la couleur du texte d'une étiquette iOS en utilisant un convertisseur de valeur avec MvvmCross. Voici un peu de code (ce qui est dans le projet de base):Xamarin MvvmCross iOS Bool à Color ValueConverter ne change pas Couleur du texte de l'étiquette

public class BoolToColorValueConverter 
     : MvxValueConverter<bool, object> 
    { 
     protected override object Convert(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      MvxColor mvxColor = null; 
      if(value) 
       mvxColor = new MvxColor(255, 0, 0); 
      else 
       mvxColor = new MvxColor(0, 0, 0); 

      var nativeColorConv = Mvx.Resolve<IMvxNativeColor>(); 

      return nativeColorConv.ToNative(mvxColor); 
     } 
    } 

Et puis, sur ma fixation:

this.CreateBinding(LabelName).For(s => s.TextColor).To((MyViewModel vm) => vm.BooleanPropertyThatChangesAtSomePoint).WithConversion("BoolToColor").Apply(); 

Mais pour une raison quelconque lorsque les changements de propriété booléennes de vrai à faux , Je vois d'autres champs liés à cette propriété changer correctement, mais pas la couleur du texte de l'étiquette.

J'ai vu des vidéos @slodge, des tutoriels, des exemples de git téléchargés mais je n'arrive toujours pas à le faire fonctionner. Je pense que cela a à voir avec le convertisseur de ne pas retourner la valeur correcte puisque j'ai mis des points de rupture et le convertisseur a été déclenché. Des idées?

Répondre

1

Tout d'abord, si ce morceau de code est la seule référence à TextColor dans votre application, le processus de liaison d'assemblage est probablement loin optimise certaines des propriétés de UILabel lorsque LinkerBehaviour est réglé sur Link SDK assemblies only ou Link all assemblies. Si tel est le cas pour votre projet, le correctif est soit de changer LinkerBehaviour-Don't link (pas idéal), ou pour ajouter la méthode suivante pour LinkerPleaseInclude:

public void Include() 
{ 
    var label = new UILabel 
    { 
     TextColor = UIColor.Black 
    }; 
} 

Si ce n'est pas la seule question, puis vous n'avez pas installé le Mvx Color Plugin. Cela devrait résoudre votre problème. Si ce n'est pas le cas, pensez à refaire votre liaison comme suit:

var bindingSet = this.CreateBindingSet<MyViewController, MyViewModel >(); 

bindingSet.Bind(LabelName).For(c => c.TextColor).To(vm => vm.TestBoolean).WithConversion(new BoolToColorValueConverter()); 

bindingSet.Apply(); 

P.S. - Juste un conseil:

Le plugin couleur vous donne accès à MvxColorValueConverter, qui fournit une façon plus succincte pour faire votre conversion de couleur:

public class BoolToColorValueConverter : MvxColorValueConverter 
{ 
    protected override MvxColor Convert(object value, object parameter, CultureInfo culture) 
    { 
     return (bool)value 
      ? new MvxColor(255, 0, 0) 
      : new MvxColor(0, 0, 0); 
    } 
} 
+0

Merci Luc et merci pour les modifications. J'ai la prise MvxColors installée. Je n'obtiens pas tout à fait l'approche LinkerPleaseInclude. Je ne peux pas trouver cette classe sur mon projet, donc je suppose qu'il doit être ajouté manuellement. J'ai suivi votre approche en utilisant le MvxColorValueConverter mais j'obtiens une erreur lorsque l'application démarre. Je vais suivre vos suggestions et vous dire comment ça se passe. – Ph0b0x

+0

En fait, en utilisant l'approche MvxColor a fait l'affaire. Il me manquait le plugin Mvx Color sur le projet IOS. Je l'ai eu dans le projet Core mais pas dans le projet IOS. Merci beaucoup Luke. – Ph0b0x

+0

La règle générale lors de l'utilisation de plugins Mvx est de s'assurer que vous ajoutez le plugin aux projets Core et Platform. Les plugins ont généralement une interface portable et des implémentations spécifiques à la plate-forme, donc l'ajout des deux garantit que cela fonctionne correctement. – Kiliman