2011-06-21 24 views
33

Co to jest użycie metody ConvertBack w interfejsie IValueConverter.Jaka jest metoda ConvertBack w interfejsie IValueConverter?

Kiedy zadzwoni?

Albo co jest kolejność wywołania z Convert i ConvertBack metody.

muszę zapytać pytanie tutaj, ponieważ: Mam związany jedną właściwość kodzie do TextBox Text obiektu i korzystania convertor dla tej nieruchomości,

następnie pierwszy Convert Sposób powoływania i kiedy zmienić TEXT w TEXTBOX nic się zdarzyć, ale zaraz po zamknięciu formularza wywołuję metodę ConvertBack.

co to jest, nie ma żadnych zasad które definiują kiedy ogieńConvertBack metody?

Możesz zauważyć, że jest to możliwe duplikat innego pytania na tej stronie ... ale nie znalazłem żadnego pytania na liście sugestii, kiedy piszę moje pytanie.

Odpowiedz

34

IMO, metoda ConvertBack służy do konwertowania wizualną reprezentację danych do konkretnej DataType.

Na przykład: używasz konwertera do konwersji wartości boolowskiej true na ciąg "TrueBoolean". Ten tekst zostanie wyświetlony w twoim TextBox. Gdy zmienisz wartość TextBox, metoda ConvertBack zostanie wywołana, gdy wiązanie zostanie ponownie uruchomione (domyślnie OnFocusLost). Teraz twoja metoda ConvertBack spróbuje przekonwertować nową wartość na typ danych, który ma być. Musisz więc zaimplementować logikę, aby przekonwertować "FalseBoolean" na false.

public class Converter : IValueConverter 
{ 
    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (bool) value ? "TrueBoolean" : "FalseBoolean"; 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var s = (string) value; 
     if (s.Equals("TrueBoolean",StringComparison.CurrentCultureIgnoreCase)) 
      return true; 
     if (s.Equals("FalseBoolean", StringComparison.CurrentCultureIgnoreCase)) 
      return false; 
     throw new Exception(string.Format("Cannot convert, unknown value {0}", value)); 
    } 
} 

Technika ta jest często stosowana w DataGrids, jeśli się nie mylę.

Nadzieja ta jest nieco jasne ...

UPDATE
O ty pytanie w komentarzu:
nadpisać domyślne zachowanie wiązania OnFocusLost trzeba zmienić wiążący tak:

<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/> 
<!--syntax might differ, can't access VS at the moment.--> 
+0

@Roel, tak ale w moim przypadku ConvertBack to ogień, kiedy zamykam okno, czy to nie dziwne? –

+1

Nie, myślę, że to normalne zachowanie: przed zamknięciem okna, zdarzenie OnFocusLost w TextBox zostanie uruchomione, lub przynajmniej aktualizacja zostanie zaktualizowana. – RoelF

+0

@Roel, co powinienem zrobić, jeśli potrzebuję mieć metodę Call ConvertBack, jak tylko wprowadzą jakąkolwiek zmianę w TEKSTU TEXTBOX? nie mogłem znaleźć właściwości wyzwalacza źródła aktualizacji, jak @Dominik mówi ... –

28

ConvertBack jest, gdy masz mode=TwoWay na oprawie.

Konwertuje dane wprowadzane przez użytkownika z powrotem na typ danych, do którego się przyłącza, a następnie wywołuje je, gdy utracą fokus wartość TextBox (na przykład).

Na przykład (jeśli nie był wbudowany), jeśli masz liczbę, która reprezentuje cenę, metoda Convert pobiera wartość i formatuje ją na ciąg znaków z poprawnym symbolem waluty, separatorem dziesiętnym itp.

Jeśli użytkownik wpisze nową wartość - w tym możliwy symbol waluty, separator tysięcy itp., Należy użyć metody ConvertBack, aby przeanalizować ciąg znaków i wyodrębnić wartość liczbową.

Innym przykładem może być wprowadzenie numeru karty kredytowej. Użytkownik może wprowadzić numer jako pojedynczy ciąg cyfr lub grup cyfr oddzielonych spacjami lub myślnikami. Metoda ConvertBack wymagałaby wszystkich tych możliwych danych wejściowych i przekształcenia ich w wymagany format pojedynczy.