1. ホーム
  2. wpf

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

2022-11-26 16:43:23

質問

私はWPFプログラムを書いていて、スタイルやテンプレートのような繰り返し可能な方法を通してテキストボックス内のデータをフォーマットする方法を見つけようとしています。私は多くのテキストボックス(正確には95)を持っており、それぞれが定義された独自の解像度を持つことができ、それ自身の数値データにバインドされています。例えば、データが99.123で解像度が2の場合、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

どのように解決するのですか?

この場合 StringFormat の上に Binding . のどちらかを使用することができます。 標準の文字列フォーマット または カスタム文字列フォーマット :

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