スタイル/テンプレートを使用してwpfの小数点以下の桁数をフォーマットする方法は?


94

私はWPFプログラムを作成しており、スタイルやテンプレートなどの繰り返し可能な方法を使用して、TextBox内のデータをフォーマットする方法を見つけようとしています。私はたくさんのTextBox(正確には95)を持っており、それぞれが独自の数値データにバインドされており、それぞれが独自の解像度を定義できます。たとえば、データが解像度2の99.123の場合、99.12と表示されます。同様に、99のデータ値と解像度3は、99.000(99ではなく)として表示されます。これを行う方法はありますか?

編集: 明確にする必要があります。現在作業している画面には95個のTextBoxがありますが、プログラムのさまざまな画面全体のすべてのTextBoxに正しい小数点以下の桁数を表示させたいと思います。今考えてみると、これらのいくつかはTextBox(現在作業している画面など)であり、いくつかはDataGridsまたはListViewsですが、TextBoxで機能させる方法を理解できれば、理解できると確信しています。他のコントロールにも使用できます。

この場合、共有するコードはそれほど多くありませんが、より明確にするように努めます。

次のプロパティ(vb.net)を含むビューモデルがあります。

    Public ReadOnly Property Resolution As Integer
        Get
            Return _signal.DisplayResolution
        End Get
    End Property

    Public ReadOnly Property Value As Single
        Get
            Return Math.Round(_signal.DisplayValue, Resolution)
        End Get
    End Property

XAMLには次のものがあります。

<UserControl.Resources>
    <vm:SignalViewModel x:Key="Signal" SignalPath="SomeSignal"/>
</UserControl.Resources>
<TextBox Grid.Column="3" IsEnabled="False" Text="{Binding Path=Value, Source={StaticResource Signal}, Mode=OneWay}" />

EDIT2(私の解決策): しばらくコンピューターから離れた後、私は顔を見つめている簡単な答えを見つけるために戻ってきました。ビューモデルでデータをフォーマットします!

    Public ReadOnly Property Value As String
        Get
            Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
        End Get
    End Property

1
IValueConverter?を使用します 実際の値と解像度をコンバーターに渡し、コンバーターがそれ自体の中で切り上げを行うようにします。StringFormatこれらの95がどのように正確にTextBox生成されるかを知らずに提案するのは難しいです。
viv 2013

現在のコードとXAMLを投稿します。そうでなければ、それはすべての推測と役に立たない推測です。
Federico Berasategui 2013

質問にさらに情報を追加しました。これにより、わかりやすくなるはずです。
AXG1010 2013

回答:


196

あなたは使うべきStringFormatBinding標準の文字列形式またはカスタムの文字列形式のいずれかを使用できます

<TextBox Text="{Binding Value, StringFormat=N2}" />
<TextBox Text="{Binding Value, StringFormat={}{0:#,#.00}}" />

StringFormatターゲットプロパティが文字列型の場合にのみ機能することに注意してください。Contentプロパティ(typeof(object))のようなものを設定しようとしている場合は、カスタムStringFormatConverterここのような)を使用し、フォーマット文字列をConverterParameter。として渡す必要があります。

更新された質問を編集する

したがって、ViewModel精度を定義する場合は、これをとして実行しMultiBinding、独自のを作成することをお勧めしますIMultiValueConverter。これは、単純なバインディングから、に拡張する必要のあるバインディングに移行するのは実際にはかなり面倒ですがMultiBinding、コンパイル時に精度がわからない場合は、これで十分です。あなたは、IMultiValueConverter値、および高精度、および出力フォーマットされた文字列を取る必要があります。を使用してこれを行うことができString.Formatます。

ただし、のようなものの場合はContentControl、:を使用するとはるかに簡単にこれを行うことができますStyle

<Style TargetType="{x:Type ContentControl}">
    <Setter Property="ContentStringFormat" 
            Value="{Binding Resolution, StringFormat=N{0}}" />
</Style>

を公​​開する任意のコントロールをContentStringFormatこのように使用できます。残念ながら、TextBoxそのようなものはありません。


6
StringFormatがに設定され#,#.00ている例はコンパイルされません-コンマは、Bindingマークアップ拡張機能の属性の区切り文字として解釈されます。
ジジ2014

@Gigi、その通りですが、次のように簡単に使用できますStringFormat={}{0:#,#.00}。正しく機能するように回答を更新します。
阿部ハイデブレヒト2014

'StringFormat = N {0}'はうまく機能します。精度が2の場合、「10.00」を除いて小数点以下2桁を表示します。ただし、「10.00」の場合は「10」を表示します。精度にバインドするときにこれを行う方法はありますか?コンバーターを使わなければならないようです。
Gordon Slysz 2016

.NET文字列形式を使用して表示される小数を変更する方法はないと思うので、コンバーターを作成する方がよいでしょう。
阿部ハイデブレヒト

2つの指定子0:#、#。00を使用する理由を説明できますか?そのうちの1つだけでは不十分です。
レイヤン

7

受け入れられた回答は、0.299のような入力を与えると整数の場所に0を表示しません。WPFUIに.3が表示されます。したがって、次の文字列形式を使用することをお勧めします

<TextBox Text="{Binding Value,  StringFormat={}{0:#,0.0}}" 

こんにちは、あなたの解決策は大丈夫ですが、タイプミスを回避し、少なくともそれがどのように表示されるかを確信しているので、キーワードN1(2,3 ...)を使用したいと思います。しかし実際、2番目の提案では、おっしゃるように値が0未満の場合は0が表示されません。
ケビンVDF

-2
    void NumericTextBoxInput(object sender, TextCompositionEventArgs e)
    {
        TextBox txt = (TextBox)sender;
        var regex = new Regex(@"^[0-9]*(?:\.[0-9]{0,1})?$");
        string str = txt.Text + e.Text.ToString();
        int cntPrc = 0;
        if (str.Contains('.'))
        {
            string[] tokens = str.Split('.');
            if (tokens.Count() > 0)
            {
                string result = tokens[1];
                char[] prc = result.ToCharArray();
                cntPrc = prc.Count();
            }
        }
        if (regex.IsMatch(e.Text) && !(e.Text == "." && ((TextBox)sender).Text.Contains(e.Text)) && (cntPrc < 3))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }

9
いくつかの説明はあなたの答えの質を大幅に改善するでしょう。
mrun 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.