私は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
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
にはそのようなものはありません。
受け入れられた答えは、0.299のような入力を与える際に整数の場所に0を表示しません。 WPF UIに.3が表示されます。したがって、次の文字列形式を使用する私の提案
<TextBox Text="{Binding Value, StringFormat={}{0:#,0.0}}"