2011-05-09 2 views
2

J'ai remarqué qu'il est possible de retourner une chaîne comme "Visible", "Collapsed", "Images/xyz.png" ou "# FFB3D1" à partir d'un convertisseur de valeur et la magie des liaisons parvient à figurer IT out. Cacher/Afficher l'élément de l'interface utilisateur, trouver l'image xyz.png ou colorier quelque chose de rose ...Conversion automatique de type XAML

Je l'ai pris pour acquis depuis longtemps, maintenant il ne fonctionne pas avec mon dernier code, donc mon La question est comment puis-je appeler manuellement cette fonctionnalité?


Explication:

Je l'ai mis à l'échelle par la création d'un MarkupExtension personnalisé, qui attache une MultiConverter qu'il attache à un MultiBinding et retourne la liaison initialisées. Cependant, lorsque ce multi-convertisseur retourne des chaînes comme "# FFB3D1" ou "Red", rien ne semble se produire.

// PseudoCode from my MarkupExtension, setting up & returning the binding/multi-converter 
public override object ProvideValue(IServiceProvider serviceProvider) 
{ 
    MultiBinding outputBinding = new MultiBinding();  
    foreach (Binding b in bindings) 
    { 
     outputBinding.Bindings.Add(b); 
    }  

    outputBinding.Converter = converter; 
    return outputBinding.ProvideValue(serviceProvider); 
} 

Je suppose que parce que je crée le MultiBinding + Converter dans le code, il est sauter une étape quelque part dans l'espace de noms Binding.Magic.


Solution:

public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     // get targets 
     IProvideValueTarget serv = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); 

     // get Type Converter 
     object[] typeConverterAttributes = ((DependencyProperty)serv.TargetProperty).PropertyType.GetCustomAttributes(typeof(TypeConverterAttribute), true); 
     TypeConverter typeConverter = null; 

     if (typeConverterAttributes.Length > 0) 
     { 
      TypeConverterAttribute attr = (TypeConverterAttribute)typeConverterAttributes[0]; 
      typeConverter = (TypeConverter)Activator.CreateInstance(Type.GetType(attr.ConverterTypeName), false); 
     } 

Il est alors simplement un cas d'application du type convertisseur manuellement

+1

L'attribut TypeConverter peut également être déclaré sur le type de la propriété, par exemple, la classe brosse elle-même. Vous pourriez vouloir que votre code vérifie là aussi. – foson

Répondre