Ввод процента в текстовое поле умножает значение на 100 - PullRequest
0 голосов
/ 10 ноября 2010

В моем приложении Silverlight есть следующее текстовое поле:

<TextBox Text="{Binding Model.PercentOfSale, Mode=TwoWay, StringFormat=p}"/>

, где PercentOfSale определяется как double.

Отображение в текстовом полекак и ожидалось:

0,00%

Однако, когда я ввожу новое значение (скажем, 15), я получаю:

1,500.00%

Таким образом, значение умножается на 100 (неправильно).

Мои пользователи не хотят вводить 0,15 в качестве значения, так что мне нужно сделать, чтобызаставить его принять 15 как 15%, а не 1500%?

Я видел здесь и другие вопросы, такие как

Как установить формат строки WPF в процентах без умножения на 100?
Формат десятичного числа для процентных значений?

Но приведенные решения не работают для меня.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Я закончил тем, что изменил установщик свойства, чтобы он изменил значение:

private decimal percentOfSale;
public decimal PercentOfSale
{
    get
    {
        return percentOfSale;
    }
    set
    {
        percentOfSale = value / 100;
        RaisePropertyChangedEvent("PercentOfSale");
    }
}

Таким образом, мой XAML становится:

<TextBox Text="{Binding PercentOfSale, Mode=TwoWay, StringFormat=p}"/>

, и когда я загружаю свою модель, у меня есть:

this.percentOfSale = Model.PercentOfSale;

обратите внимание на нижний регистр "p" - это позволяет избежать масштабирования при начальной настройке, так что StringFormat в привязке работает правильно, а когда значение устанавливается из пользовательского интерфейса, оно также масштабируется.

Затем, когда я хочу сохранить данные, которые у меня есть:

Model.PercentOfSale = this.percentOfSale;

Я обнаружил, что проценты хранятся в виде значений от 0 до 100 (не от 0 до 1) - этоне моя модель данных, и я должен был сначала проверить, поэтому это означает, что мне нужно масштабировать значение при начальной настройке:

this.PercentOfSale = Model.PercentOfSale;

Обратите внимание на верхний регистр "P".

и при сохранении:

Model.PercentOfSale = this.percentOfSale * 100;

, чтобы привести его в соответствие с данными, хранящимися в базе данных.

0 голосов
/ 10 ноября 2010

А как насчет использования конвертеров?
Если вы не хотите изменять входные значения, тогда вы можете конвертировать.
Вот пример использования преобразователей.

...