2010-12-27 9 views
12

Kiedy moi użytkownicy wybierają datę za pomocą kontrolki Calander w obrębie elementu DatePicker, wartość zostaje poprawnie powiązana z obiektem bazowym. ALE, jeśli użytkownik wpisze datę w DatePicker, kliknie przycisk, tekst nie jest ustawiony na właściwość SelectedDate.DatePicker.SelectedDate nie zmienia się, gdy wprowadzany jest tekst

Użytkownik musi usunąć kursor z pola tekstowego w obiekcie DatePicker, aby zaktualizować związany obiekt.

<toolkit:DatePicker Name="_dpField" Grid.Column="1" MinWidth="100" 
       ToolTip="{Binding Path=ToolTipText}" 
       TextInput="_dpField_TextInput" 
       SelectedDate="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/> 

POMOC! jak mogę się upewnić, że ta wpisana wartość jest używana w kodzie zdarzeń przycisków?

Dzięki!

Odpowiedz

5

Można użyć konwertera do analizowania swój wpisany tekst do ważnego datetime

Przykładowe

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string strValue = System.Convert.ToString(value); 
     DateTime resultDateTime; 
     if (DateTime.TryParse(strValue, out resultDateTime)) 
     { 
      return resultDateTime; 
     } 
     return value; 

    } 

Xaml

 <Controls:DatePicker 
    Text="{Binding OrderDate,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
    SelectedDate="{Binding RelativeSource={RelativeSource Self},Path=Text, 
    Converter={StaticResource DateConverter}}"> 
+0

Gotcha, mogę to zrobić. Jestem tylko ciekawy, dlaczego powiązanie dla wybranej daty występuje tylko wtedy, gdy celowo zaciera się pole tekstowe selektora daty. Myślę, że muszę zadać inne pytanie dotyczące zdarzenia kliknięcia z WPF i dlaczego nie powoduje on, że powiązanie przesuwa wartość do powiązanego obiektu, zanim zdarzenie zostanie uruchomione dla kliknięcia przycisku. dzięki za pomoc –

+0

** Aktualizacja ** właśnie zaimplementowała konwerter i działa.teraz, aby rozpocząć nowe pytanie dotyczące trybu powiązania i zdarzeń kliknięcia. –

17

Znalazłem prostsze rozwiązanie, gdzie don Potrzebuję DateConverter.

Zawieram tylko na własności Text i używam TargetNullValue=''.

<DatePicker x:Name = "dpDisbursementDate" 
      Text = "{Binding NameOfMyProperty, Mode=TwoWay,  
      UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, 
      TargetNullValue=''}"/> 
+0

to poważnie podstępne! –

+0

To jest absolutnie genialne! Działa jak urok dla mnie. –

+2

Ta odpowiedź wydaje się naprawiać pierwotny problem, ale istnieje inny niebezpieczny problem, który nie jest od razu widoczny: różne formaty daty nie są poprawnie przetwarzane. Jestem z Finlandii i używamy formatu dd.mm.rrrr. Ta implementacja została przeanalizowana w dniu 9 grudnia 2014 r. Na dzień 11 września 2014 r. –

1

Jedynym rozwiązaniem, które udało mi się znaleźć to, aby wyłączyć wprowadzanie daty w datepicker ustawiając Focusable="False" i tylko umożliwiając wybór z kalendarza. W ten sposób możemy przynajmniej upewnić się, że otrzymamy prawidłową datę.

-2

To chyba trochę za późno, ale utknąłem na tym od jakiegoś czasu.

Jeśli masz inny element WPF możesz zmienić fokus na ten na początku zdarzenia naciśnięcia przycisku, spowoduje to, że proces ten zostanie przetworzony na dowolny tekst wprowadzony w jego polu tekstowym. Próbowałem tylko tego z comboboxem, ale wygląda na to, że działa i pozwala ci nadal mieć niestandardowe formatowanie w twoich datach (np. 26.04.2016, a nie 26.04.2016). Zakładam, że byłbyś w stanie użyć niewidzialnego elementu, jeśli nie masz nic, na co możesz się skupić.

private void btnInbound_Complete_Click(object sender, RoutedEventArgs e) 
    { 
     if (Validation()) 
     { 
      comboInbound_Result.Focus();//THIS IS SO THAT ANY MANUAL DATEPICKER ENTRY IS ACCEPTED BEFORE THE REST OF THE BUTTON CODE IS RUN 
      SQLinbound_CompleteItem(); 
      ClearAll(); 
     } 
    } 
0

Oto proste rozwiązanie, które pomogło mi nawet z formatem daty europejskiej/niemieckiej "dd.MM.rrrr".

Dodaj do xaml elementu głównego

xml:lang="de-AT" 

i datepicker wygląda następująco:

<DatePicker SelectedDate="{Binding PropertyName, StringFormat=dd.MM.yyyy}" Name="datePicker" /> 

nadzieję, że pracuje dla Ciebie!

Powiązane problemy