Ich schreibe ein WPF-Programm und versuche herauszufinden, wie Daten in einer TextBox mithilfe einer wiederholbaren Methode wie einem Stil oder einer Vorlage formatiert werden können. Ich habe viele TextBoxen (95 um genau zu sein) und jede ist an ihre eigenen numerischen Daten gebunden, für die jeweils eine eigene Auflösung definiert werden kann. Wenn die Daten beispielsweise 99,123 mit einer Auflösung von 2 sind, sollte sie 99,12 anzeigen. Ebenso sollte ein Datenwert von 99 und Auflösung 3 als 99.000 (nicht 99) angezeigt werden. Gibt es eine Möglichkeit, dies zu tun?
Bearbeiten: Ich sollte klarstellen, dass sich auf dem aktuellen Bildschirm, an dem ich arbeite, 95 Textfelder befinden, aber ich möchte, dass jedes Textfeld auf den verschiedenen Bildschirmen in meinem Programm die richtige Anzahl von Dezimalstellen anzeigt. Nun, da ich darüber nachdenke, sind einige davon TextBoxen (wie der Bildschirm, an dem ich gerade arbeite) und andere DataGrids oder ListViews, aber wenn ich herausfinden kann, wie es für TextBoxen funktioniert, kann ich es sicher herausfinden es auch für die anderen Kontrollen.
In diesem Fall gibt es nicht viel Code zum Teilen, aber ich werde versuchen, es klarer zu machen:
Ich habe ein Ansichtsmodell, das die folgenden Eigenschaften enthält (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
und in der XAML habe ich:
<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 (meine Lösung): Es stellte sich heraus, dass ich, nachdem ich eine Weile vom Computer weggegangen war , zurückkam, um eine einfache Antwort zu finden, die mich ins Gesicht starrte. Formatieren Sie die Daten im Ansichtsmodell!
Public ReadOnly Property Value As String
Get
Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
End Get
End Property
quelle
IValueConverter
? Übergeben Sie den tatsächlichen Wert und die Auflösung an den Konverter und lassen Sie ihn für sich selbst aufrunden. Es ist schwer, eine vorzuschlagen,StringFormat
ohne zu wissen, wie genau diese 95erTextBox
erzeugt werden.Antworten:
Sie sollten die
StringFormat
auf der verwendenBinding
. Sie können entweder Standardzeichenfolgenformate oder benutzerdefinierte Zeichenfolgenformate verwenden :Beachten Sie, dass dies
StringFormat
nur funktioniert, wenn die Zieleigenschaft vom Typ Zeichenfolge ist. Wenn Sie versuchen, so etwas wie eineContent
Eigenschaft (typeof(object)
) festzulegen, müssen Sie eine benutzerdefinierteStringFormatConverter
( wie hier ) verwenden und Ihre Formatzeichenfolge als übergebenConverterParameter
.Für aktualisierte Frage bearbeiten
Wenn Sie also
ViewModel
die Genauigkeit definieren, würde ich empfehlen, dies als zu tunMultiBinding
und Ihre eigene zu erstellenIMultiValueConverter
. In der Praxis ist dies ziemlich ärgerlich, von einer einfachen Bindung zu einer zu wechseln, die zu einer erweitert werdenMultiBinding
muss. Wenn die Genauigkeit beim Kompilieren jedoch nicht bekannt ist, ist dies so ziemlich alles, was Sie tun können. SieIMultiValueConverter
müssten den Wert und die Genauigkeit übernehmen und die formatierte Zeichenfolge ausgeben. Sie könnten dies mit tunString.Format
.Für Dinge wie a
ContentControl
können Sie dies jedoch viel einfacher tun mitStyle
:Jedes Steuerelement, das a verfügbar macht,
ContentStringFormat
kann wie folgt verwendet werden. HatTextBox
so etwas leider nicht.quelle
#,#.00
wird nicht kompiliert. Das Komma wird als Trennzeichen für Attribute in derBinding
Markup-Erweiterung interpretiert .StringFormat={}{0:#,#.00}
. Ich werde die Antwort aktualisieren, damit sie richtig funktioniert.Die akzeptierte Antwort zeigt bei einer Eingabe wie 0,299 keine 0 an einer ganzzahligen Stelle. Es zeigt .3 in der WPF-Benutzeroberfläche. Also mein Vorschlag, folgendes String-Format zu verwenden
quelle
quelle