2009-11-02 1 views
10

quando si dichiara convertitori in un'applicazione WPF, dovrei:Devo dichiarare convertitori in App.xaml o come risorsa per file?

  1. Dichiarare tutti i miei convertitori nel App.xaml (cioè in <Application.Resources/>), quindi è a disposizione per l'intera applicazione
  2. Dichiarare convertitori solo necessari per ogni Page/Window/ResourceDictionary/UserControl ecc nella loro sezione Resources
  3. qualcosa di completamente diverso

Per quanto riguarda la leggibilità, il metodo 1 sembra il migliore per me, ma la mia domanda riguarda le prestazioni. Quale metodo è il più efficiente in termini di prestazioni, memoria, ecc.?

risposta

37

Beh, non li dichiaro affatto in xaml. Invece, ho anche derivato un mio convertitore da MarkupExtension. Come questo:

public class MyValueConverter : MarkupExtension, IValueConverter 
{ 
    private static MyValueConverter _converter = null; 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (_converter == null) _converter = new MyValueConverter();  
     return _converter; 
    } 

    public object Convert 
    (object value, Type targetType, object parameter, CultureInfo culture) { } 
    public object ConvertBack 
    (object value, Type targetType, object parameter, CultureInfo culture) { } 
} 

Questo mi permette di usare il mio convertitore da nessuna parte, in questo modo:

Source="{Binding myValue, Converter={converters:MyValueConverter}}" 

dove convertitori è lo spazio dei nomi in cui ho dichiarato il mio convertitore.

Ho imparato questo trucco solo da un vecchio thread di stackoverflow.

+2

Ho appena imparato qualcosa, sicuramente sarà utile! – Shimmy

+2

E sì, questo è migliore in termini di prestazioni in quanto non istanzia un nuovo oggetto ogni volta che viene utilizzato il convertitore. Crea solo un'istanza prima del ritorno della prima chiamata a MarkupExtension e restituisce la stessa istanza ogni volta. – Yogesh

+0

Grazie! Questo rende la vita più facile. – si618

0

Se è necessario un convertitore per una sola finestra, lo inserisco per una finestra (o anche solo per il controllo contenitore che contiene il controllo che lo utilizza).

Direi che questo è più gestibile: puoi guardare la dichiarazione del convertitore ed essere in grado di dire cosa lo usa. Sai che se cambi i controlli su quella particolare pagina per non utilizzare più il convertitore, puoi estrarlo dalle risorse della pagina senza influire su nient'altro. Viceversa, se un convertitore è una risorsa applicativa, non è così semplice accertare che cosa lo sta usando, semmai.

Se lo stesso convertitore viene utilizzato da più di una pagina, vorrei ancora metterlo sotto ogni risorsa di pagina. In realtà, è solo una riga in più nell'XAML.

Ad ogni modo, questa è la mia opinione, da oggi. Mi aspetto un altro post che discuta esattamente l'opposto. :-)

+0

Non ho avuto tanta fortuna. La mia risposta era metà opposta, la metà della stessa :-P – devuxer

2

Ho un ResourceDictionary che dichiara diversi convertitori comunemente necessari, come un convertitore bool-to-visibility. Faccio riferimento a questo dizionario direttamente in App.xaml.

Dichiaro altri convertitori che sono più specifici di una determinata situazione a livello di pagina/finestra (o in un riferimento di risorsa a cui fa riferimento una pagina/finestra).

Non riesco a rispondere alla domanda di prestazioni in modo definitivo, ma sarei molto sorpreso se facesse una differenza pratica nel tempo di caricamento o nell'utilizzo della memoria. Dichiarare un convertitore è fondamentalmente una istanziazione di oggetti, quindi dovrebbe essere molto efficiente e usare pochissima memoria, ma non ho fatto alcuna profilazione per confrontare le prestazioni a livello di app rispetto a quelle a livello di finestra.

+0

Beh, questa era la mia domanda ... Se mai saprai la risposta alle prestazioni, ti preghiamo di non dimenticare di tornare. – Shimmy