2011-09-02 11 views
6

W mojej aplikacji opartej na MVVM potrzebuję do sprawdzania poprawności pól z wpisu danych. Jeśli to możliwe, chciałbym użyć standardowego wiązania sprawdzania poprawności WPF z ErrorTemplates.Walidacja deterministyczna i asynchroniczna w WPF

Jednak chciałbym wykonanie logiki walidacji być całkowicie napędzany/wywołany przez ViewModel (Push do widoku, a nie ciągnąć przez View) z następujących powodów:

  1. musi pracować asynchronicznie ponieważ logika sprawdzania poprawności może trochę potrwać.
  2. muszę być bardziej deterministyczne i drobnoziarnista kiedy logika walidacja ma być wykonane (np tylko gdy użytkownik kliknie przycisk „Zastosuj” lub gdy stan wewnętrzny zmienione w taki sposób, że przyjęcie nagle stają się nieważne)

Wiem, że Silverlight ma INotifyDataErrorInfo, który został wprowadzony do dokładnie tego celu, ale WPF tego nie robi. W jaki sposób mam nadal moją logikę walidacji wydedukowaną deterministycznie i asynchronicznie?

+0

Wydaje się, że jest to po prostu niemożliwe, więc muszę iść inną drogą, jak opisano tutaj: http://stackoverflow.com/questions/7293277/create-a-visualtree-off-of -a-control-template-in-code – bitbonk

+0

Należy zauważyć, że WPF 4.5 wprowadził obsługę podobną do Silverlight dla INotifyDataErrorInfo, tutaj na przykład: http://anthymecaillard.wordpress.com/2012/03/26/wpf-4-5-validation -asynchrone/ – GrahamMc

Odpowiedz

0

Wbudowana funkcja sprawdzania poprawności dla WPF i Silverlight służy do szybkiego sprawdzania poprawności po stronie klienta (na przykład Regex, analiza składniowa itp.).

Jeśli chcesz przejść do serwera w celu sprawdzenia poprawności (lub sprawdzanie poprawności zajmuje dużo czasu), zrobiłbym to w niestandardowy sposób. Takie jak po kliknięciu przycisku Zapisz, itp

więc powiedzieć, że masz sposób zapisywania w ViewModel (nie wspominając o których MVVM ramy używasz):

public void Save() 
{ 
    //Do your validation, this might start a new thread (I use Async CTP myself) 

    //If validation is good, do your extra work, else display validation errors 
} 

Chciałbym po prostu zrobić wszystko Potrzebne do tego działania w ramach działania w ViewModelu

+0

Więc mówisz, że nie mogę używać ErrorTemplates? Muszę polegać na tym, że zbudował on szablony błędów WPF i niestandardowych elementów sterujących. na przykład Chciałbym pokazać standardową czerwoną obwódkę wokół nieprawidłowego pola tekstowego. Jak mogę wymusić pokazanie tej granicy? – bitbonk

+0

Sugerowałem, aby użyć metody, takiej jak najlepsza odpowiedź, sugeruje tutaj: http://stackoverflow.com/questions/921601/how-can-i-le-e-validation-error-in-my-viewmodel-instead-of -my-views-code-beh. Nie wydaje mi się, że dobrym pomysłem jest użycie wbudowanego sprawdzania poprawności, jeśli ma to być długa operacja (zawsze będzie blokować interfejs użytkownika). – jonathanpeppers

+0

Nadal muszę zmaterializować coś w rodzaju "ErrorTemplate" i wyświetlić go, gdy maszyna wirtualna zgłosi zdarzenie. Ponieważ niektóre z moich formularzy mają niestety dość dużo pól, nie chciałbym, aby obraz błędu od razu był częścią wizualnego drzewa, ale powinien zostać utworzony (np. Przez zachowanie), gdy wystąpi błąd sprawdzania poprawności dla tego pola: Zobacz więcej informacje w moim pytaniu uzupełniającym: http://stackoverflow.com/questions/7293277/create-a-visualtree-off-of-a- control-template-in-code – bitbonk