WPF - IValueConverter i dependency injection

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:

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

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

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:

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.

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

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.

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1