2012-03-04 11 views
6

Tworzę prostą aplikację WPF. Mam funkcję OpenFile:Czy powinienem umieścić tę funkcję w widoku (z kodem) lub w ViewModelu?

private void OpenFile(string fileName) 
{ 
    if(!File.Exists(Helper.GetPath(fileName))) 
    { 
     MessageBox.Show("Error opening file"); 
    } 
    else 
    { 
     //Code to handle file opening 
    } 
} 

Idealnie gdzie powinna być obecna ta funkcja? Czuję, że powinien być w .xaml.cs, ponieważ uzyskuje dostęp do MessageBox, który jest częścią View. Ale to także wywołuje mojego pomocnika, który jest w modelu. Więc myślę, że może być w ViewModel. Jaka jest korzyść z posiadania tego w View lub w ViewModel? Czy ktoś może mi pomóc z pewnymi wskazówkami?

Dzięki.

Odpowiedz

7

Jedną z zalet umieszczenia go w modelu widoku będzie testowalność. Można napisać test jednostkowy, który sprawdza, czy okno komunikatu jest wyświetlane tylko wtedy, gdy plik istnieje (dokładniej byłby to test integracji, jeśli uderzasz w system plików).

Jednakże, ponieważ korzystasz bezpośrednio z okna komunikatu, test nigdy nie zostanie ukończony na serwerze kompilacji, ponieważ urządzenie będzie oczekiwało na dane wejściowe od użytkownika podczas wyświetlania okna komunikatu.

W związku z tym pracowałbym przeciwko abstrakcji w modelu widoku, dzięki czemu można mock the message box podczas testów.

7

Ta funkcja musi być w ViewModel. Musisz utworzyć operację w widoku, aby wyświetlić komunikat o błędzie i wywołać tę metodę zamiast MessageBox.Show. Pokazywanie okna komunikatu musi być wykonane w View.

Generalnie powinieneś unikać wdrażania jakiejkolwiek logiki biznesowej wewnątrz View, takiej jak sprawdzanie poprawności lub obsługa pliku.

2

Jeśli używasz Microsoft Prism, możesz użyć interfejsu IInteractionRequest, aby utworzyć widok MessageBox, ale w rzeczywistości przekazać niezbędną odpowiedź do modelu widoku.

Jeśli jesteś użytkownikiem , a nie przy użyciu Microsoft Prism, spójrz na to, jak działa ta część i albo wykonaj jej symulację, albo skorzystaj z frameworka wykonującego coś podobnego.


zasadzie, że kod powinien iść na widok-model sprawdzalności, ale zamienić linię, gdzie jawnie wywołać MessageBox i korzystania z IInteractionRequest wspomniany zamiast.

Oto dokumentacja związana ze scenariuszem, który chcesz wdrożyć: Chapter 6: Advanced MVVM Scenarios. Spójrz na podany wzór Wzory interakcji użytkownika.

Powiązane problemy