2011-09-14 11 views
5

Stavo esaminando un mio vecchio codice e ho trovato una classe ibrida IValueConverter/MarkupExtension. Mi sono chiesto se il IServiceProvider nel metodo ProvideValue fosse effettivamente utile e come sarebbe utile?MarkupExtension.ProvideValue - L'IServiceProvider è effettivamente utilizzato?

Vedo che IServiceProvider ha un solo metodo: GetService, che deve essere inoltrato al tipo di servizio appropriato. Ho anche guardato la pagina MSDN MarkupExtension.ProvideValue e elenca diversi tipi di servizi. Immagino, mi stavo chiedendo se qualcuno di questi servizi è utile o devo lasciare il mio metodo così com'è?

Metodo attuale:

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

In sostanza, si deve fare quanto segue:

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

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

    //Do something with the provider here? 
} 

risposta

6

Se i MarkupExtension opere senza neeeding qualsiasi interazione con il IServiceProvider poi, ovviamente, non c'è nulla da guadagnare da accedervi . Tutte le combo MarkupExtension/ValueConverter che ho visto e scritto anch'io rientrano in questa categoria.

Passando da questioni pratiche, se si sta solo cercando materiale di lettura ci sono più informazioni su quali servizi il provider può rendere disponibile e come potrebbero essere utili here.

11

Il provider può essere utile per ottenere informazioni sull'oggetto di destinazione e sulla proprietà a cui viene applicato, ad esempio. Se non è necessario conoscere questi valori, allora non c'è bisogno di usarlo

Esempio

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; 

    // ... 
} 
Problemi correlati