Jak mogę sformatować dziesiętnie powiązane z TextBoxem bez gniewu moich użytkowników?

Usiłuję wyświetlić sformatowany dziesiętny w TextBox przy użyciu powiązania danych w WPF.

Cele

Cel 1: Ustawiając właściwość dziesiętną w kodzie, wyświetl 2 miejsca dziesiętne w polu tekstowym.

Cel 2: Gdy użytkownik wchodzi w interakcję z (wpisuje się) w TextBox, nie wkurzaj go.

Cel 3: Powiązania muszą aktualizować źródło na właściwości PropertyChanged.

Próbowanie

Próba 1: brak formatowania.

Tutaj zaczynamy prawie od zera.

<TextBox Text="{Binding Path=SomeDecimal, UpdateSourceTrigger=PropertyChanged}" />

Narusza cel 1.SomeDecimal = 4.5 pokaże „4.50000” w polu tekstowym.

Attempt 2: Użyj StringFormat w Binding.

<TextBox Text="{Binding Path=SomeDecimal, UpdateSourceTrigger=PropertyChanged, StringFormat=F2}" />

Narusza cel 2. Powiedz, że część dziesiętna to 2,5, a pole tekstowe wyświetla „2,50”. Jeśli zaznaczymy wszystko i wpiszemy „13.5”, otrzymamy „13.5.00” w polu tekstowym, ponieważ formater „pomocne” wstawia liczby dziesiętne i zera.

Próba 3: użyj rozszerzonego MaskedTextBox rozszerzonego pakietu WPF Toolkit.

http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox

Zakładając, że czytam dokumentację poprawnie, maska ​​## 0.00 oznacza „dwie opcjonalne cyfry, po których następuje wymagana cyfra, kropka dziesiętna i dwie kolejne wymagane cyfry. To zmusza mnie do powiedzenia„ największej możliwej liczby, którą można wprowadzić ten TextBox ma 999,99 ”, ale powiedzmy, że jestem w porządku.

<xctk:MaskedTextBox Value="{Binding Path=SomeDecimal, UpdateSourceTrigger=PropertyChanged}" Mask="##0.00" />

Narusza cel 2. TextBox zaczyna się od___.__ i wybranie go i wpisanie wydajności 5,75575.__. Jedynym sposobem uzyskania 5.75 jest wybranie TextBox i wpisanie<space><space>5.75.

Próba 4: użyj błystki obrotowej rozszerzonego zestawu narzędzi WPF Toolkit.

http://wpftoolkit.codeplex.com/wikipage?title=DecimalUpDown

<xctk:DecimalUpDown Value="{Binding Path=SomeDecimal, UpdateSourceTrigger=PropertyChanged}" FormatString="F2" />

Narusza cel 3. DecimalUpDown radośnie ignoruje UpdateSourceTrigger = PropertyChanged. Jeden ze koordynatorów na rozszerzonej stronie Codeplex zestawu narzędzi WPF sugeruje zmodyfikowany szablon ControlTemplate pod adresemhttp://wpftoolkit.codeplex.com/discussions/352551/. Spełnia to cel 3, ale narusza cel 2, wykazując to samo zachowanie co w próbie 2.

Próba 5: Korzystając ze znaczników danych stylu, używaj formatowania tylko wtedy, gdy użytkownik nie edytuje.

Powiązanie z podwójnym ciągiem StringFormat na TextBox

Nawet jeśli ten spełnił wszystkie trzy cele, nie chciałbym go używać. (A) Pola tekstowe stają się po 12 linii zamiast 1, a moja aplikacja zawiera wiele, wiele pól tekstowych. (B) Wszystkie moje pola tekstowe mają już atrybut stylu, który wskazuje globalny zasób statyczny, który ustawia margines, wysokość i inne rzeczy. (C) Być może zauważyłeś, że poniższy kod ustawia dwukrotnie ścieżkę wiążącą, co narusza zasadę DRY.

<TextBox>
    <TextBox.Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Text" Value="{Binding Path=SomeDecimal, StringFormat=F2}" />
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Text" Value="{Binding Path=SomeDecimal, UpdateSourceTrigger=PropertyChanged}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

Wszystkie te niewygodne rzeczy na bok ...

Narusza cel 2. Najpierw kliknięcie pola tekstowego, które wyświetla „13.50”, nagle powoduje wyświetlenie „13.5000”, co jest nieoczekiwane. Po drugie, jeśli zaczynasz od pustego TextBoxa i wpisuję „13.50”, TextBox będzie zawierał „1350”. Nie potrafię wyjaśnić dlaczego, ale naciśnięcie klawisza kropki nie wstawia liczb dziesiętnych, jeśli kursor znajduje się na prawym końcu łańcucha w polu tekstowym. Jeśli TextBox zawiera ciąg o długości> 0, a ja zmieniam położenie kursora w dowolnym miejscu poza prawym końcem łańcucha, mogę wstawić kropki dziesiętne.

Próba 6: Zrób to sam.

Zamierzam rozpocząć walkę z bólem i cierpieniem, albo podklasując TextBox, albo tworząc załączoną własność, i sam pisząc kod formatujący. Będzie pełna manipulacji sznurkiem i spowoduje znaczną utratę włosów.

Czy ktoś ma jakieś sugestie dotyczące formatowania miejsc dziesiętnych związanych z polami tekstowymi, które spełniają wszystkie powyższe cele?

questionAnswers(3)

yourAnswerToTheQuestion