MVVM odwoływanie się do kontrolek i Service locator

0

Zastanawia mnie fakt, w jaki sposób najlepiej manipulować view np. z viewmodelu mam na myśli operację na kontrolkach w code-behind. Doszedłem do wniosku, że można by do tego użyć service locatora i view potraktować jako service, czyli:

public partial class SampleView : UserControl, ISampleService
    {
        public SampleView ()
        {
            InitializeComponent();
            ServiceLocator.Instance.AddService<ISampleService>(this);
        }
    }

Z tym, że to generuje zależności od view, a dokładniej od tego kiedy powstanie, a inny service może być zależny od ISampleService i chcieć do niego uzyskać dostęp wcześniej niż będzie on dodany do service locatora. A co za tym idzie nie można z niego korzystać w konstruktorze, a możliwie jak najpóźniej aby upewnić się, że będzie on już dostępny.

Znalazłem jeszcze coś takiego: https://stackoverflow.com/a/14247023/6751581 co wydaje się być najbardziej sensowne, tylko przy większej ilości interfejsów IView można utonąć w projekcie z plikami, wychodzę z założenie, że jeden view będzie mógł przyjąć na siebie obsługę kilku interfejsów typu I*View.

Macie jakieś sprawdzone sposoby? czy dodawanie podczas servic'ów do service locatora np. w konstruktorze obiektu nie jest anty-wzorecem?

3

Sugeruje w ViewModelu wystawić eventy i z poziomu code behind widoku się na nie zapinać. Generalnie VM nie powinien mieć żadnych zależności do widoku.

2

Service locator sam w sobie w niektórych kręgach uchodzi już za antywzorzec, a co dopiero w tej sytuacji.
Jeśli VM komunikuje się w jakikolwiek inny sposób z View niż za pomocą bindigów to wiedz że się coś dzieje, i najlepiej jakby sie dało tego uniknąć, no ale nie zawsze się da.
Rozwiązania z StackOverfloow umożliwia testowanie VM więc jest jak najbardziej zgodne z MVVM. Drugie rozwiązanie to użycie wspomnianych eventów.
Oba rozwiązania to tak naprawdę implementacja odwróconego sterowania i wybór jednego z nich zależy od kontekstu, czy chcemy mieć większa kontrolę i użyć dependency inversion( za pomocą interfejsów które określają czego potrzebuje VM, a których implementacje dostarczają widoki), czy mniejszą kontrolę a większa elastyczność - eventy.

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