Как получить простое редактирование поля в процентах в WPF TextBox? - PullRequest
1 голос
/ 16 декабря 2011

Когда вы форматируете TextBox как валюту и щелкаете для его редактирования, $ и запятые не вызывают проблем, вы можете просто редактировать и вкладывать без проблем. Когда вы форматируете поле в процентах, вещи работают не так хорошо.

<TextBox Text="{Binding CostMarkup, 
                         StringFormat=P}"
                Style="{StaticResource ctrlSpacingTight}" />

Если базовое значение равно 0,1, оно правильно отображается как 10%, если вы перейдете к редактированию, оно по-прежнему показывает, что 10%% вызовет проблему, плюс оно изменит базовое значение с 0,1 до 10. Я написал конвертер чтобы справиться со всем этим, но мне интересно, если нет лучшего способа. В частности, есть ли способ справиться с этим так, как это делает валюта?

Существует встроенный конвертер валют, поэтому я подозреваю, что в версии StringFormat для валют это используется. Хотя есть ZoomPerentageConverter, он не делает то, что я ожидал. Есть ли способ подключиться к StringFormat = P и заставить его вызывать мой конвертер вместо того, чтобы идти к каждому экземпляру и явно указывать его?

<TextBox Text="{Binding CostMarkup, 
                         StringFormat=P,
                         Converter={StaticResource pctConverter}}"
                Style="{StaticResource ctrlSpacingTight}" />

1 Ответ

3 голосов
/ 16 декабря 2011

Я всегда обнаруживал, что проще всего отображать необработанные данные при редактировании, а форматированное значение - нет.

Вот пример, который делает это с помощью триггера

<Style x:Key="ctrlSpacingTight" TargetType="{x:Type TextBox}">
    <!-- Other Style Setters -->
    <Setter Property="Text" Value="{Binding CostMarkup, StringFormat={}{0:C}}" />
    <Style.Triggers>
        <Trigger Property="IsKeyboardFocused" Value="True">
            <Setter Property="Text" Value="{Binding CostMarkup}" />
        </Trigger>
    </Style.Triggers>
</Style>

Если ctrlSpacingTight является глобальным стилем, вы можете создать стиль для вашего TextBox, который будет BasedOn вашим глобальным стилем.

<Style x:Key="CurrencyTextBox" TargetType="{x:Type TextBox}"
       BasedOn="{StaticResource ctrlSpacingTight}">
    <Setter Property="Text" Value="{Binding CostMarkup, StringFormat={}{0:C}}" />
    <Style.Triggers>
        <Trigger Property="IsKeyboardFocused" Value="True">
            <Setter Property="Text" Value="{Binding CostMarkup}" />
        </Trigger>
    </Style.Triggers>
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...