5

Estaba revisando un viejo código mío y encontré una clase híbrida IValueConverter/MarkupExtension. Me pregunto si el IServiceProvider en el método ProvideValue fue realmente útil, y ¿cómo sería útil?MarkupExtension.ProvideValue - ¿Se utiliza realmente IServiceProvider?

Veo que IServiceProvider solo tiene un método: GetService, que debe convertirse al tipo de servicio adecuado. También miré en la página de MSDN MarkupExtension.ProvideValue y enumera diferentes tipos de servicios. Supongo que me pregunto si alguno de esos servicios es útil o debería dejar mi método tal como está.

Método actual:

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

Básicamente, debería hacer lo siguiente:

public Object ProvideValue(IServiceProvider serviceProvider) 
{ 
    var provider = serviceProvider as SomeType; 

    if (provider == null) return new MyConverter(); 

    //Do something with the provider here? 
} 

Respuesta

6

Si sus MarkupExtension obras sin neeeding cualquier interacción con el IServiceProvider entonces, evidentemente, no hay nada que ganar de acceder a él . Todos los combos MarkupExtension/ValueConverter que he visto y escrito yo mismo también entran en esta categoría.

Pasando de los asuntos prácticos, si solo está buscando material de lectura, hay más información sobre los servicios que el proveedor puede ofrecer y cómo podrían ser útiles here.

11

El proveedor puede ser útil para obtener información sobre el objeto de destino y la propiedad a la que se está aplicando, por ejemplo. Si no es necesario conocer estos valores, entonces no hay que usarla

Ejemplo

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; 

    // ... 
} 
Cuestiones relacionadas