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