WPF - IValueConverter i dependency injection

WPF - IValueConverter i dependency injection
JU
  • Rejestracja:około 22 lata
  • Ostatnio:2 miesiące
  • Postów:5042
0

Cześć, zastanawiam się nad jedną rzeczą. Czy można w jakiś sposób wstrzyknąć do konwertera obiekt nie zaśmiecając kodu?

Generalnie mam konwerter, który pełni rolę "tłumacza". W sensie localizera. Używam go w niektórych miejscach w taki sposób:

Kopiuj
<Line ToolTip="{Binding [0].ErrorContent, Converter={StaticResource TranslatorConverter}}"/>

Mój TranslatorConverter wygląda tak (część kodu usunięta dla czytelności):

Kopiuj
class TranslatorConverter : IValueConverter
    {
        ILocalizer localizer;

        public TranslatorConverter()
        {
            var container = Application.Current.Properties[nameof(IocContainer)] as IocContainer;
            localizer = container.Resolve<ILocalizer>();
        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
                return localizer[value.ToString()];
            else
                return string.Empty;
        }
    }

A w App.xaml.cs mam:

Kopiuj
ContainerBuilder builder = new ContainerBuilder();
factory = new IocContainer(builder);
Properties[nameof(IocContainer)] = factory;

Nie podoba mi się ten kod, ale nie wiem jak to zrobić lepiej. Więc, czy można to zrobić lepiej w takiej sytuacji? Chodzi mi o to, żeby nie dopisywać niczego do XAMLa.

Grzegorz Świdwa
Grzegorz Świdwa
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:385
0

IValueCoverter jest wywoływany przy NotifyPropertyChanged. Jeżeli podczas zmiany swojej właściwości wywołasz to zdarzenie dla dowolnego obiektu który zostanie przekazany do konwertera będzie to działać. Możesz nawet przekazać cały model

neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:3 dni
  • Lokalizacja:Kraków
  • Postów:1114
1

Nie obejdziesz tego, osobiście bym zrobił singletona, albo jakieś pola statyczne, a nie szedł przez propertisy. Zresztą jest to kawałek infrastruktury, którego nie będziesz testował więc nie ma sensu na siłę próbować zrobić tego inaczej.


obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:33 minuty
0

nie wiem o czym jest pierwsza odpowiedź powyżej

Jakiego frameworka/kontenera używasz? Przykładowo prism od wersji 7.1 ma normalnie wsparcie dla WPF, zwyczajnie wystarczy że dodasz ILocalizer jako parametr w konstruktorze i będzie działać.
Ewentualnie możesz stworzyć dependency property i zabindować ze swojego modelu, który dostanie localizer z DI do instancji w resourcach. Trzecim wyjściem jest podanie localizera jako ConverterParameter


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 2x, ostatnio: obscurity

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.