2009-11-02 11 views
10

Al declarar convertidores en una aplicación WPF, en caso de que:¿Debo declarar convertidores en App.xaml o como un recurso por archivo?

  1. Declarar todos mis convertidores en el App.xaml (es decir, en <Application.Resources/>) para que esté disponible para toda la aplicación
  2. Declarar convertidores sólo se necesitan para cada Page/Window/ResourceDictionary/UserControl etc., en su sección Resources
  3. algo completamente distinto

En cuanto a la legibilidad, el método 1 parece ser el mejor para mí, pero mi pregunta es sobre el rendimiento. ¿Qué método es más eficiente en términos de recursos en términos de rendimiento, memoria, etc.?

Respuesta

37

Bueno, simplemente no los declaro en xaml en absoluto. En cambio, también derivo un convertidor mío desde MarkupExtension. De esta manera:

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) { } 
} 

Esto me permite usar mi convertidor en cualquier lugar, así:

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

donde convertidores es el espacio de nombres en el que he declarado mi convertidor.

Aprendí este truco de un antiguo hilo stackoverflow solamente.

+2

¡Acabo de aprender algo, seguro que será útil! – Shimmy

+2

Y sí, esto es mejor en términos de rendimiento, ya que no instancia un nuevo objeto cada vez que se utiliza el convertidor. Solo crea una instancia antes de la devolución de la primera llamada a MarkupExtension y devuelve la misma instancia cada vez. – Yogesh

+0

¡Gracias! Esto hace la vida más fácil. – si618

0

Si solo necesita un convertidor para la ventana, lo pondría para la única ventana (o incluso solo para el control de contenedor que contiene el control que lo usa).

Yo diría que esto es más fácil de mantener: puede consultar la declaración del convertidor y saber qué lo usa. Usted sabe que si cambia los controles en esa página en particular para que deje de usar el convertidor, puede sacarlo de los recursos de la página sin afectar a nada más. Por el contrario, si un convertidor es un recurso de la aplicación, no es tan simple determinar qué es lo que lo está utilizando, en todo caso.

Si el mismo convertidor está siendo utilizado por más de una página, yo lo haría todavía póngalo debajo de cada recurso de la página. Realmente, es solo una línea adicional en el XAML.

De todos modos, esa es mi opinión, a partir de hoy. Estoy esperando otra publicación argumentando exactamente lo contrario. :-)

+0

No hubo suerte. Mi respuesta fue la mitad opuesta, la mitad de lo mismo :-P – devuxer

2

Tengo un ResourceDictionary que declara varios convertidores comúnmente necesarios, como un convertidor bool-to-visibility. Hago referencia a este diccionario directamente en App.xaml.

Declaro otros convertidores que son más específicos para una situación dada en el nivel de página/ventana (o en un documento de referencia al que hace referencia una página/ventana).

No puedo responder la pregunta de rendimiento de forma definitiva, pero me sorprendería mucho si esto supusiera una diferencia práctica en el tiempo de carga o el uso de la memoria. Declarar un convertidor es básicamente una instanciación de objetos, por lo que debe ser muy eficiente y usar muy poca memoria, pero no he hecho ningún perfil para comparar el nivel de aplicación con el rendimiento a nivel de ventana.

+0

Bueno, esa era mi pregunta ... Si alguna vez conoce la respuesta de rendimiento, no olvide volver. – Shimmy

Cuestiones relacionadas