Mam problem z sprawdzaniem poprawności między wieloma polami. Na przykład - Mam ViewModel o nazwie RangeDateViewModel, który zawiera 2 wystąpienia klasy o nazwie DateViewModel, każdy z nich reprezentuje odpowiednio datę rozpoczęcia i datę zakończenia.Sprawdzanie poprawności między wieloma polami na różnych poziomach
więc moja oprawa wygląda następująco -
<TextBox Text="{Binding StartDate.Date, ValidateOnDataError=True}">
<TextBox Text="{Binding EndDate.Date, ValidateOnDataError=True}">
Moja klasa RangeDateViewModel implementuje interfejs IDataErrorInfo. W moim planem, RangeDateViewModel by potwierdzić, że data rozpoczęcia jest przed terminem końcowym, stosując logikę walidacji w IDataErrorInfo [ „propertyName”] funkcji tak -
public string this[string columnName]
{
get
{
return ValidationError();
}
}
Problemem jest to, że nigdy nie jest podczas wywoływania, zamiast tego wywoływane są właściwości IDataErrorInfo, które znajdują się w każdej z klas DateViewModel.
Przypuszczam, że dzieje się tak dlatego, że właściwość bound nie znajduje się na tym samym poziomie co RangeDateViewModel, ale zamiast tego znajduje się w podrzędnej funkcji DateViewModel.
Myślę, że moja potrzeba jest dość prosta i musi istnieć łatwe rozwiązanie tego problemu. Próbowałem używać ValidationRules zamiast IDataErrorInfo, ale wtedy miałbym problemy z powiadomieniem ViewModel o aktualnym statusie sprawdzania poprawności z ValidationRules.
Dzięki Daniel! Próbowałem tego, co sugerowałeś, ale najwyraźniej wciąż nie jest wystarczająco dobry. Właściwość IDataErrorInfo rzeczywiście uzyskuje dostęp, ale tylko podczas inicjowania szablonu, a nie później, gdy rzeczywiste dane zostaną zmienione. Domyślam się, że to dlatego, że StartDate i EndDate są obiektami złożonymi, że same nie są zmieniane, ale właściwości wewnątrz nich, a to nie jest wystarczająca forma do podniesienia PropertyChanged. Może powinienem jakoś podnieść wydarzenie, gdy zmieni się właściwości wewnętrznej daty? – Dror
@Dror: Masz rację. Zobacz krok trzeci w zaktualizowanej odpowiedzi. –
Jeszcze raz dziękuję Daniel! To zadziałało, chociaż wciąż mam jeszcze jeden drobny problem, z którym się borykam. Dzięki temu rozwiązaniu wynikiem są dwie kontrolki zaznaczone na czerwono, gdy wartość jest nieważna. Chciałbym, aby zamiast zaznaczonych na czerwono, Stackpanel, który przechowuje te dwa pola, zostanie oznaczony jako przeczytany. Korzystnie te dwa pola nie będą zaznaczone, ale nie jest to koniecznością. Próbowałem zastosować DataTrigger na właściwości bool na RangeDateViewModel o nazwie "HasErrors", który ustawi "Validation.HasError" na true, ale niestety jest to właściwość tylko do odczytu. Mam nadzieję, że pomożecie mi w tej kwestii. – Dror