2013-05-02 11 views
7

Mam model, który implementuje INotifyPropertyChanged i może zostać zaktualizowany przez wątek biznesowy tła. Związany z nim ViewModel również implementuje INotifyPropertyChanged. Ich widok oczywiście wiąże się z ViewModel. Ten widok może być wyświetlany w wielu miejscach, a moim celem jest, aby wszystkie zostały zaktualizowane po zmianie modelu.Jeśli model implementuje INotifyPropertyChanged, jak powinien rejestrować/wyrejestrować ViewModel dla zdarzenia PropertyChanged?

Wiem, że ViewModel powinien zarejestrować się na PropertyChanged wydarzenie Model. Ale nie wiem, kiedy i gdzie jest najlepsze miejsce na rejestrację i deregistrację. Szczególnie o wyrejestrowaniu, ponieważ obawiam się, że setki mechanizmów obsługi zdarzeń VM w Modelu dla VM/widoków, które nie są już pokazywane.

Z góry dziękuję.

Odpowiedz

4

Czy bezwzględnie konieczne jest ograniczenie widoku bezpośrednio związanego z modelem?

można wystawiać model jako własność na VM i mieć swój View bezpośrednio wiążą się z nim w ten sposób nie mający VM subskrybować INPC od modelu

coś takiego:

public class MyViewModel: INotifyPropertyChanged { 
... 

private MyModel _model; 
public MyModel Model { 
    get { 
    return _model; 
    } 
    set { 
    if (value == _model) 
     return; 
    value = _model; 
    RaisePropertyChanged(() => Model); 
    } 
} 
... 

} 

oraz w XAML (gdy MyViewModel jest DataContext): Aktualizacja

<TextBlock Text="{Binding Model.ModelProperty}" /> 

:

Może to z jakiejś pomocy dla gwintowania do PropertyChanged wydarzeń modeli w „słabym” moda

IWeakEventListener

Korzystanie z centralną imprezę Dyspozytornia w WeakEventManager umożliwia teleskopowe dla słuchaczy być śmieci zebrane (lub ręcznie oczyszczone), nawet jeśli czas życia obiektu źródłowego wykracza poza elementy nasłuchu.

który jest stosowany w

Josh Smith's PropertyObserver

ta powinna miejmy nadzieję rozwiązać kwestię konieczności wyraźnie wyrejestrować?

+0

Dzięki za odpowiedź. Myślę, że to konieczne. Ponieważ muszę manipulować danymi modelu, aby móc być związanymi łatwo i czysto. – n0ne

+0

manipulować danymi modelu gdzie? w VM? to też nie jest dobra praktyka. Powinieneś manipulować danymi Modelu w Modelu, jeśli tak, lub jeśli jest to manipulacja dla renderowania Widoku, powinna być w Konwerterze. – Viv

+0

Tak, chodzi mi o jakiś widok renderujący coś w rodzaju. Renderowanie jest dość skomplikowane, co nie jest tylko pojedynczym mapowaniem właściwości do obiektu, z którego mogę korzystać z konwertera. – n0ne

0

Usunąłem problem przez podpięcie się do modelu zdarzeń podczas ładowania i usunięcie ich po rozładowaniu. Problem polega na tym, że model widoku może ominąć zdarzenia, jeśli jest poza ekranem. Zwykle odświeżam dane szybko po załadowaniu.

OnLoad - Odśwież dane maszyny wirtualnej od modelu i przechwytuj zdarzenia. OnUnLoad - usuń wszystkie zaczepy, które założyłeś.

+0

Dobry pomysł! Ale co, jeśli przedmiot jest wyłączony z ekranu po zwolnieniu? VM go ominie, a haki zdarzeń pozostaną tam na zawsze ... – n0ne

+0

Zdarzenie rozładowania najprawdopodobniej zostanie wywołane, gdy przedmiot zniknie z ekranu, ale nawet jeśli pozostanie załadowany, w pewnym momencie zostanie rozładowany, gdy nie będzie już uruchamiany. wymagany. – Andy

+0

@Andy, jeśli coś subskrybuje zdarzenia twojego obiektu (np. INPC), nigdy nie będzie zbierać śmieci - Dlaczego nie skorzystać z WeakEvents? – BrainSlugs83

Powiązane problemy