2010-09-12 5 views
0

Je travaille donc sur un petit projet utilisant les cartes bing silverlight sdk. Je reçois un tas d'objets sur un serveur (via les services wcf) et chacun de ces périphériques a des propriétés lat/long. Pour mapper quelque chose sur les cartes bing, vous le fournissez avec un type d'emplacement (essentiellement un wrapper pour lat/long)Silverlight xaml lié à la méthode d'extension

Les types avec lesquels je travaille sont stockés sur le serveur et n'ont que lat long. J'ai écrit une méthode d'extension appelée Location qui les enveloppe dans un emplacement et les renvoie.

 <DataTemplate x:Key="MapVisualDataTemplate"> 
     <m:Pushpin m:MapLayer.Position="{Binding Location}" /> 
    </DataTemplate> 

Même si la méthode d'extension est visible et utilisable depuis C#, elle n'est pas correctement utilisée par le xaml. Si j'ajoute la propriété directement dans le type sur le serveur cela fonctionne bien. Ce n'est qu'en l'ayant défini comme une méthode d'extension que cela ne fonctionne pas. Je préférerais que ce soit une méthode d'extension, car il va finalement être utilisé sur une grande variété de types.

Est-il possible de lier à l'aide de la syntaxe ci-dessus lorsque Location est une méthode d'extension pour tout type actuellement lié?

Répondre

2

Je crois que la raison est que dans xaml vous devez lier à une propriété ou une propriété de dépendance. Une méthode d'extension est juste cela, une méthode. Même si la méthode imite une propriété, elle n'est pas tout à fait la même chose.

1

Les équivalents XAML des méthodes d'extension sont des convertisseurs de valeur. Voici un exemple:

public class Converter:IValueConverter 
{ 
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return "foo"; 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
0

Je pense que c'est possible. Si je vais avoir un peu de temps, je vais essayer de créer MarkupExtension qui aidera à faire cela. Pour l'instant, mon idée est de créer une classe MarkupExtension avec les propriétés Source et Méthode. En XAML nous l'utilisons comme ici:

<TextBlock Text="{BindExt Source={Binding DataContext}, Method=MyExtMethod}" /> 

Source est une propriété où nous avons mis un objet source sur laquelle nous invoquons MyExtMethod (Méthode d'extension). En raison de la performance de trouver une telle méthode, j'ai probablement ajouter une autre propriété appelée ExType, où sera stocké un type de classe statique où MyExtMethod a été déclaré. Cela peut aider à améliorer les performances de la recherche de méthode d'extension, mais la syntaxe XAML sera plus:/

Nous avons donc maintenant une expression prototype:

<TextBlock Text="{BindExt Source={Binding DataContext}, Method=MyExtMethod, ExType=ex:ExtMethods}" /> 

où le préfixe « ex » peut être par exemple espace de noms BrightShadow.Data.Extensions:

xmlns:ex="clr-namespace:BrightShadow.Data.Extensions;assembly=BrightShadowAssembly" 

Peut-être que quelque chose proche avenir à ce sujet je vais poster sur mon blog polonais here.

Questions connexes