MVVM nie zezwala na kod i obsługę zdarzeń. Więc jaki jest sposób MVVM, aby otrzymywać powiadomienia o zmianie komórki?Jak radzić sobie z WPF DataGrid CellEditEnding w MVVM?
Odpowiedz
Jest to dość uzasadnione i oczywiste pytanie, ponieważ istnieją całkiem uzasadnione rozwiązania tego problemu dla MVVM. Wydaje mi się, że ktoś go odznaczył, ponieważ prawdopodobnie został już zadany niezliczoną ilość razy.
Wiem, że jest coś wbudowanego, aby to zrobić w .Net4. Utknąłem w .Net3.5, więc używam klasy CommandReference z zestawu narzędzi WPF, aby przekonwertować zdarzenie w widoku na polecenie w viewmodelu.
Rozwiązaniem problemu dla MVVM jest obsługa tego zdarzenia, jak sądzę. :) –
Ale "jak" to pytanie !! Nie można dodawać procedur obsługi zdarzeń bez zrywania MVVM. Polecenie polecenie umożliwia konwertowanie zdarzenia w interfejsie na polecenie w maszynie wirtualnej. – NVM
Czy potrzebujesz obsługi zdarzenia CellEditEnding? Czy byłaby to możliwość wykonania kodu w ustawieniu nieruchomości, która jest związana z komórką?
"MVVM nie zezwala na kod za, a więc obsługę zdarzeń."
Whoops! Jest problem.
MVVM zniechęca kod, to prawda, ale tylko wtedy, gdy coś można zrobić rozsądnie przez Xaml. "Nie będziesz kodować z tyłu" nigdy nie zostało powiedziane przez nikogo z tropem.
Czasami obsługa wydarzenia jest najprostszym, najlepszym sposobem na osiągnięcie celu. Kiedy to sytuacja, obejmij ją, rozwiąż problem i przejdź dalej. Czasami osiągnięcie XAML nie jest możliwe. W takich przypadkach wyrzuć logikę widoku do kodu kodu widoku i przejdź dalej.
O wiele ważniejsze jest utrzymanie celów architektonicznych MVVM (oddzielenie problemów między warstwami) niż ścisłe przestrzeganie zasad postępowania (takich jak unikanie błędów w kodach). Jeśli to rozróżnienie nie jest dokonywane , tęsknisz za lasem dla drzew.
Cóż, masz rację i jesteś w błędzie. Jeśli dodajesz jakiś kod tylko do robienia czegoś czysto UI, to jest w porządku. Powiedz jednak, że jeśli zdarzenie kończące edycję komórki zaktualizuje coś w twoim modelu (przez twoją maszynę wirtualną), to jest to bardzo bardzo zły pomysł (IMO). – NVM
To zależy od tego, jak dobrze nadaje się twój model do pracy w DataGrid. W sytuacji, w której mam teraz pracę, np. Zmuszono mnie do użycia pojedynczego wiersza datagridu do reprezentowania pojedynczego elementu.VM nie będzie eksponować kolekcji tych przedmiotów, które mogą zawierać tylko jedną instancję, co byłoby niedorzeczną ulgą po stronie VM dla dziwnego odniesienia w V. Raczej V jest odpowiedzialny za transformację co maszyna wirtualna ujawnia jako faktyczna potrzeba aplikacji w to, czego potrzebuje. –
Nie jestem pewien, czy rozumiem, jaki jest twój scenariusz. Ale nie zgadzam się ze stwierdzeniem, że "pogląd jest odpowiedzialny za przekształcenie tego, co VM udostępnia". Widok jest odpowiedzialny za "pokazywanie" tego, co VM udostępnia. Maszyna wirtualna jest odpowiedzialna za transformację modelu. Widok powinien prosić maszynę wirtualną tylko o przekształcenie rzeczy w modelu na podstawie żądania użytkowników. Widok nie przekształca niczego w model, który jest całkowicie odpowiedzialny za VM. I VM istnieje dokładnie dlatego, że modele nie są bezpośrednio dostosowane do poglądów roboczych (takich jak datagridview). – NVM
Ponieważ nigdy nie było odpowiedzi na to pytanie; to, czego chcesz, to implementacja "zdarzenia do polecenia". Zasadniczo przechwytuje wybrane zdarzenie i wywołuje implementację ICommand
na swoim ViewModelu.
Podano już odpowiedź here w podsumowaniu (sprawdź odpowiedź Dereka Beattiego).
- 1. MVVM: Jak radzić sobie z interakcją między zagnieżdżonymi ViewModels?
- 2. WPF MVVM pobierać datagrid wybrane wiersze
- 3. Jak najlepiej radzić sobie z przyciskami radiowymi WPF?
- 4. Jak radzić sobie z StackOverflowError w Javie?
- 5. jak radzić sobie z unicode w mako?
- 6. Jak radzić sobie z IEnumerable w F #?
- 7. Jak radzić sobie z autorotacją w AVCaptureVideoPreviewLayer?
- 8. Jak radzić sobie z przepełnieniem w C
- 9. Jak radzić sobie z IOException w Iterable.forEach?
- 10. Jak radzić sobie z połączeniami z hgsubversion?
- 11. Jak radzić sobie z podprojektami z autotoolami?
- 12. Jak radzić sobie z deserializacją z polimorfizmem?
- 13. Jak radzić sobie z unique_ptr z SWIG
- 14. Jak radzić sobie z polimorfizmem z JSF2?
- 15. Jak radzić sobie z wydajnością w wielkich UniformGrids?
- 16. Edytowalny Datagrid w WPF
- 17. WPF: Kopiowanie z DataGrid
- 18. Jak radzić sobie z nieujemnymi modami?
- 19. Jak radzić sobie z Eclipse CDT + Cygwin?
- 20. Jak radzić sobie z nieciągłością Git?
- 21. Jak radzić sobie z błędami pobierania JavaScript?
- 22. Jak radzić sobie z awarią AsyncTask
- 23. Jak radzić sobie z GooglePlayServicesRepairableException i GooglePlayServicesNotAvailableException
- 24. Jak radzić sobie z org.apache.tomcat.util.threads.TaskQueue.take() hotspot?
- 25. Jak radzić sobie z wyjątkami REST?
- 26. swift - Jak radzić sobie z niezamkniętym wyjątkiem
- 27. gettext, jak radzić sobie z homonimami?
- 28. Jak radzić sobie z danymi wynikowymi fetchxml?
- 29. Jak radzić sobie z tym błędem git
- 30. Jak radzić sobie z monstrualnymi działaniami Struts?
Wydaje mi się, że jest to dla mnie uzasadnione pytanie, ale być może trzeba być nieco bardziej gadatliwym z pytaniem: czego dokładnie nie rozumiesz w związku z tym wydarzeniem? Czy chcesz wiedzieć, czy należy to zrobić w widoku lub w widoku modelu? * (Oto podpowiedź: ViewModel nie powinien nic wiedzieć o DataGrid). * – slugster
@slugster - Oczywiście nie mogę użyć tego zdarzenia, ponieważ MVVM nie zezwala na kod Behind. Moje pytanie brzmi: co mogę zrobić zamiast korzystać z tego wydarzenia? – Erez
MVVM nie * zabrania * kodu za, po prostu * zniechęca * i daje wzór do osiągnięcia tego ideału. Co dokładnie należy zrobić po zmianie komórki datagrid (odpowiedź na to pytanie może narzucać)? – slugster