0

我一直在寻找一种处理百分比的好方法。在我们的应用程序中,我们需要使用不同的小数位数显示和编辑百分比值,即当用户当前不关注文本框时,它应该显示 12.50%,但在编辑该值时,它应该显示为 0.12501015512312311。更糟糕的是,用户应该能够选择在运行时显示的小数位数。此外,应该允许用户输入 12.5%,这将转换为 0.125。我知道我可以使用转换器来做到这一点,但是我无法将所有这些要求组合成一个体面的解决方案。

这是我迄今为止最好的尝试:

public class PercentConverter : IValueConverter
{
    private static int numberOfDecimals = CultureInfo.CurrentCulture.NumberFormat.PercentDecimalDigits;
    public static int NumberOfDecimals
    {
        get { return numberOfDecimals; }
        set
        {
            if(value != numberOfDecimals)
            {
                numberOfDecimals = value;
            }
        }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        decimal pct = System.Convert.ToDecimal(value);
        CultureInfo ci = new CultureInfo(CultureInfo.CurrentCulture.Name, false);
        ci.NumberFormat.PercentDecimalDigits = NumberOfDecimals;
        return String.Format(ci, "{0:P}", pct);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string percentString = value as string;
        string doubleString = percentString.TrimEnd(culture.NumberFormat.PercentSymbol.ToCharArray());
        double percent = Double.Parse(doubleString, NumberStyles.Any);

        if (IsExplicitPercentage(percentString, culture))
        {
            percent /= 100;
        }

        return percent;
    }

    private bool IsExplicitPercentage(string percentString, CultureInfo culture)
    {
        return percentString.Contains(culture.NumberFormat.PercentSymbol);
    }
}

然后在 xaml

<DataGrid.Columns>
            <DataGridTextColumn Header="Beskrivelse" Binding="{Binding Description}" />
            <DataGridTemplateColumn Header="Share">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox HorizontalContentAlignment="Right" HorizontalAlignment="Stretch">
                            <TextBox.Style>
                                <Style TargetType="{x:Type TextBox}">
                                    <!-- Other Style Setters -->
                                    <Setter Property="Text" Value="{Binding Share, Converter={StaticResource pctConverter}}" />
                                    <Style.Triggers>
                                        <Trigger Property="IsKeyboardFocused" Value="True">
                                            <Setter Property="Text" Value="{Binding Share}" />
                                        </Trigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBox.Style>
                        </TextBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>

但这不会正确绑定到数据上下文,当我更改文本框中的值时,它不会更新它绑定到的模型上的属性。

请注意,我对 WPF 很陌生,所以我可能会遗漏一些基本的东西。

4

1 回答 1

0

您需要修改Text属性的绑定:

<Setter Property="Text" Value="{Binding Share, Converter={StaticResource pctConverter}, UpdateSourceTrigger=PropertyChanged}" />

这将导致DataContext对象属性中的值随着每个字符的键入而改变。默认情况下,字段失去焦点后属性会发生变化。

于 2013-05-30T13:16:44.697 回答