MarkupExtension.ProvideValue – IServiceProvider est-il réellement utilisé?

Je parcourais un ancien code mien et IValueConverter tombé sur une IValueConverter hybride IValueConverter / MarkupExtension . Je me suis demandé si IServiceProvider dans la méthode ProvideValue était réellement utile et comment cela serait utile.

Je constate IServiceProvider a une seule méthode: GetService , qui doit être GetService dans le type de service approprié. J’ai également consulté la page MSDN MarkupExtension.ProvideValue qui répertorie différents types de services. Je suppose que je me demande simplement si certains de ces services sont utiles ou devrais-je simplement laisser ma méthode telle quelle?

Méthode actuelle:

 public Object ProvideValue(IServiceProvider serviceProvider) { return new MyConverter(); } 

Fondamentalement, devrais-je faire ce qui suit:

 public Object ProvideValue(IServiceProvider serviceProvider) { var provider = serviceProvider as SomeType; if (provider == null) return new MyConverter(); //Do something with the provider here? } 

Si votre MarkupExtension fonctionne sans nécessiter d’interaction avec IServiceProvider il n’y a évidemment aucun IServiceProvider y accéder. Toutes les MarkupExtension / ValueConverter que j’ai vues et écrites moi-même entrent également dans cette catégorie.

Passons maintenant aux questions pratiques. Si vous ne recherchez que du matériel de lecture, vous trouverez plus d’informations sur les services que le fournisseur peut proposer et sur la manière dont ils pourraient être utiles ici .

Le fournisseur peut être utile pour obtenir des informations sur l’object et la propriété cibles auxquels il est appliqué, par exemple. Si vous n’avez pas besoin de connaître ces valeurs, vous n’avez pas besoin de les utiliser

Exemple

 public override object ProvideValue(IServiceProvider provider) { IProvideValueTarget service = (IProvideValueTarget)provider.GetService(typeof(IProvideValueTarget)); DependencyObject targetObject = service.TargetObject as DependencyObject; DependencyProperty targetProperty = service.TargetProperty as DependencyProperty; // ... }