2010-09-18 10 views
5

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?

+0

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

+0

@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

+2

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

Odpowiedz

1

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.

+0

Rozwiązaniem problemu dla MVVM jest obsługa tego zdarzenia, jak sądzę. :) –

+0

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

0

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ą?

-1

"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.

+0

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

+0

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. –

+0

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

0

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).

Powiązane problemy