web-dev-qa-db-ja.com

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

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

編集:作業中の現在の画面には95個のTextBoxがありますが、プログラムのさまざまな画面のすべてのTextBoxに小数点以下の桁数を正しく表示する必要があります。考えてみると、これらの一部は(現在作業中の画面のように)TextBoxであり、一部はDataGridsまたはListViewsです。他のコントロールについても同様です。

この場合、共有するコードはあまりありませんが、より明確にするようにします。

次のプロパティ(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
80
AXG1010

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にはそのようなものはありません。

162
Abe Heidebrecht

受け入れられた答えは、0.299のような入力を与える際に整数の場所に0を表示しません。 WPF UIに.3が表示されます。したがって、次の文字列形式を使用する私の提案

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