wpfperformanceivalueconverter

Should I declare converters in App.xaml or as a per-file resource?


When declaring converters in a WPF application, should I:

  1. Declare all my converters in the App.xaml (i.e. in <Application.Resources/>) so it's available to the entire application
  2. Declare only needed converters for each Page/Window/ResourceDictionary/UserControl etc. in their Resources section
  3. Something else entirely

Regarding readability, method 1 seems the best to me, but my question is about performance. Which method is the most resource efficient in terms of performance, memory, etc.?


Solution

  • Well, I just don't declare them in xaml at all. Instead, I additionally derive a converter of mine from MarkupExtension. Like this:

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

    This allows me to use my converter anywhere, like this:

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

    where converters is the namespace in which I have declared my converter.

    Learned this trick from an old stackoverflow thread only.