2015-08-04 15 views
8

Also in meinem XAML Ich habe dies:In XAML möchte ich StringFormat verwenden, um einen numerischen Wert ohne Rundung anzuzeigen. Ist es möglich?

<TextBlock Text="{Binding MyDecimalProperty, StringFormat={}{0:#.###}}"/> 

Wenn der Wert von MyDecimalProperty zum Beispiel ist 5,35570256 dann gezeigt das TextBlock- Wert ist 5,356

Gibt es eine Möglichkeit die TextBlock- 5.355 zeigen, statt zu haben (dh um die Zahl abzuschneiden anstatt sie zu runden) mit StringFormat?

Ich weiß, dass ich einen Wertkonverter verwenden kann, aber ich wollte wissen, ob ich StringFormat oder irgendetwas anderes verwenden kann, das im XAML definiert ist, um dasselbe zu erreichen.

aktualisieren: Menschen halten sich fragen, warum ich einen Konverter nicht verwenden möchten. Bitte lesen Sie oben fett. Es ist nicht so, dass ich nicht will; Ich wollte nur wissen, ob ich das gleiche mit StringFormat oder einem anderen XAML-Konstrukt machen kann.

Vielen Dank.

+0

ht tp: //stackoverflow.com/a/18362876/2470362 –

+0

@AbinMathew Ich sehe nicht, wie das meine Frage beantwortet. Nach dem, was ich beobachtet habe, wenn die Genauigkeit der Eingabezahl größer ist als die Formatzeichenfolge, wird gerundet. In meinem Beispiel hat die Zahl 4 Dezimalstellen, aber die Formatzeichenfolge hat 3 Platzhalter. Sorgfalt zu erarbeiten? – tolism7

+0

Ok. StringFormat funktioniert für String-Typen. Auf diese Weise wird das Runden nicht funktionieren. jetzt, wenn Sie Runden benötigen, können Sie einen Konverter verwenden, um das zu tun. und gebe den gerundeten Wert zurück. –

Antwort

1

wenn ich String oder irgendetwas anderes in der XAML verwenden definiert die gleiche

String ist spezifisch für die Binding Markup Extension (eigentlich der Bindungsbasis BindingBase.StringFormat Property (System.Windows.Data)) und schließlich nutzt die .NET-String zu erreichen solche Formatierung als ToString("G3") (siehe Standard Numeric Format Strings), die rundet und nicht abschneidet; Es ist also nicht möglich, solche Features in Xaml zu überschreiben.


eine andere Eigenschaft auf der Ansichtsmodell erstellen, das ist ein assoziiertes string Typ, der einfach Papagei der Wert ist wollte, aber abgeschnitten. Dann binden Sie als solche.

Ansichtsmodell

public decimal TargetDecimal 
{ 
    get { return _TargetDecimal; } 
    set { _TargetDecimal = value; 
     OnPropertyChanged("TargetDecimal"); 
     OnPropertyChanged("TargetValueTruncated"); } 
} 

// No error checking done for example 
public string TargetValueTruncated 
{ 
    get { return Regex.Match(_TargetDecimal.ToString(), @"\d+\.\d\d\d").Value; } 
} 

XAML

<TextBlock Text="{Binding TargetDecimal, StringFormat=Original: {0}}"/> 
<TextBlock Text="{Binding TargetDecimal, StringFormat=Modified: {0:#.###}}"/> 
<TextBlock Text="{Binding TargetValueTruncated, StringFormat=Truncated: {0}}"/> 

Ergebnis

enter image description here

+0

Auf der Grundlage, dass diese Antwort erklärt, warum StringFormat in XAML nicht tun kann, was ich tun möchte, ist dies die akzeptierte Antwort. Vielen Dank. – tolism7

3

Ich glaube nicht, dass Sie dies einfach mit StringFormat tun können. Gibt es einen Grund, warum Sie keinen Konverter verwenden möchten? (siehe unten).

Converter:

public class TruncateConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value != null) 
     { 
      double truncated; 
      if (Double.TryParse(value, out truncated)) 
      { 
       return ((double)((int)(truncated * 1000.0)))/1000.0; 
      } 
     } 
     return string.Empty; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return DependencyProperty.UnsetValue; 
    } 
} 

Verbrauch:

<TextBlock Text="{Binding MyDecimalProperty, Converter={StaticResource TruncateConverter}}"/> 
+0

Danke für Ihre Antwort. Wie ich in der Frage erwähnt habe, ist es nicht so, dass ich keinen Konverter verwenden möchte, vielmehr war ich neugierig, ob das StringFormat es mir erlaubte, dies irgendwie zu erreichen. – tolism7

3

Wenn Sie einen Konverter nicht verwenden wollen (ich bin nicht sicher, warum, aber Sie werden Ihre Gründe haben) können Sie prüfen die sich wandelnde gab den Typ Ihrer Bindungsquelle zurück und implementierte dann die Schnittstelle IFormattable.

Schauen Sie sich dieses Beispiel an. Zunächst einmal sollte Ihre MyDecimalProperty keine Dezimalzahl mehr zurückgeben. Sie sollten es ändern, um eine TruncatedDecimal zurückzugeben. Hier sein Code:

public class TruncatedDecimal : IFormattable 
{ 
    private decimal value; 

    public TruncatedDecimal(decimal doubleValue) 
    { 
     value = doubleValue; 
    } 

    public decimal Value 
    { 
     get 
     { 
      return value; 
     } 
    } 

    public string ToString(string format, IFormatProvider formatProvider) 
    { 
     int decimalDigits = Int32.Parse(format.Substring(1)); 
     decimal mult = (decimal)Math.Pow(10, decimalDigits); 
     decimal trucatedValue = Math.Truncate(value * mult)/mult; 

     return trucatedValue.ToString(format, formatProvider); 
    } 
} 

Jetzt in Ihrem XAML können Sie die Formatzeichenfolge verwenden, die Sie benötigen:

<TextBlock Text="{Binding StringFormat={}N5}" Margin="5" FontSize="20" /> 

So zum Beispiel, wenn die Datacontext auf diese Weise festgelegt ist:

DataContext = new TruncatedDecimal(new Decimal(.4997888869)); 

Sie werden sehen 0.49978. Ich hoffe, dass diese Lösung für Ihre Bedürfnisse geeignet ist und Ihnen helfen kann.

+0

Danke für Ihre Antwort. Dies ist ein interessanter Ansatz, aber ich halte den Konverter für eine einfachere Lösung, da der Eigenschaftstyp in meinem Ansichtsmodell nicht geändert wird. Nachdem ich das gesagt habe, habe ich in der Frage hervorgehoben, warum ich überhaupt keinen Konverter verwende, da es scheint, dass die Leute diesen Teil vermissen. Ich wollte nur herausfinden, ob dies direkt in XAML mit StringFormat oder etwas anderem möglich ist. – tolism7

Verwandte Themen