2015-08-04 19 views
8

Yani benim XAML bu var: TextBlock yerine 5.355 göstermek için bir yol MyDecimalProperty değeri örneğin 5,35570256 için olduğundaherhangi yuvarlama şey olmadan bir sayısal değer görüntülemek için StringFormat kullanmak istiyorum. Mümkün mü?

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

sonra gösterilen TextBlock değeri 5,356

olduğunu var mı (yani StringFormat kullanarak yerine yuvarlamak için numarayı kırpmak için?

Değer Dönüştürücüsü kullanabileceğimi biliyorum ancak StringFormat veya XAML'de tanımlanan başka bir öğeyi kullanıp kullanamayacağımı öğrenmek istedim.

Güncelleme: İnsanlar bir dönüştürücü kullanmak istemiyorsanız neden merak ediyorum. Lütfen yukarıdakileri kalın olarak okuyun. Onun istemediğim değil; Sadece StringFormat veya başka bir XAML yapısı ile aynı şeyi yapıp yapamayacağımı bilmek istedim.

Teşekkür ederiz.

+0

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

+0

@AbinMathew Sorunun nasıl yanıt verdiğini göremiyorum. Gözlemlediklerimden, girdi numarası hassasiyeti tanımlanan format dizgesinden daha büyükse, yuvarlama gerçekleşiyor. Benim örneğimde, sayı 4 ondalık basamağa sahiptir, ancak biçim dizgisinde 3 yer tutucu vardır. Detaylandırmaya özen gösterilsin mi? – tolism7

+0

Tamam. StringFormat, dize türleri için çalışır. böylece yuvarlama bu şekilde çalışmayacak. Şimdi yuvarlamaya ihtiyacınız varsa bunu yapmak için bir dönüştürücü kullanabilirsiniz. ve yuvarlanmış değeri döndür. –

cevap

1

aynı

StringFormat Binding Markup Extension (aslında bağlama bazı BindingBase.StringFormat Property (System.Windows.Data)) özgüdür ulaşmak için XAML StringFormat veya başka bir şey tanımlanmış kullanmak ve sonuçta böyle biçimlendirme Net dizesini kullanır eğer ToString("G3") (Standard Numeric Format Strings bakınız) yuvarlar ve kesecek olmadığı gibidir; bu nedenle Xaml gibi özellikleri geçersiz kılmak mümkün değildir.


basitçe papağan değer istedi ama kesik var ilişkili string türüdür ViewModel başka özelliği oluşturun. Sonra böyle bağla.

ViewModel

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}}"/> 

Sonucu

enter image description here

+0

Bu cevaba dayanarak, XAML'de kullanılan StringFormat'ın neden yapmak istediğimi yapamadığını açıkladığı gibi, kabul edilen yanıt budur. Teşekkürler. – tolism7

3

Ben sadece StringFormat kullanarak bunu yapabilirsiniz sanmıyorum. Bir dönüştürücü kullanmak istememenizin bir nedeni var mı? (aşağıya bakınız).

Dönüştürücü:

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; 
    } 
} 

Kullanımı: Bir dönüştürücü kullanmak istemiyorsanız

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

Cevabınız için teşekkür ederiz. Soruda bahsettiğim gibi, bir dönüştürücü kullanmak istemediğimden değil, daha çok StringFormat'ın bunu başarmak için bana izin vermiş olup olmadığını merak ettim. – tolism7

3

(neden emin değilim, ancak nedenleri olsa gerek) değiştirmekte düşünebilirsiniz senin bağlayıcı kaynağı türünü ve sonra IFormattable arabirimini uygulayan döndü.

Bu örnek için bir göz atın. Öncelikle MyDecimalProperty, artık ondalık bir değer döndürmemelidir. Bir TruncatedDecimal döndürmek için bunu değiştirmelisiniz. İşte kod:

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

Yani, örneğin, DataContext bu şekilde ayarlanırsa:

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

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); 
    } 
} 

Şimdi XAML senin ihtiyacınız biçim dizesi kullanabilirsiniz

Sen 0,49978 göreceksiniz. Umarım bu çözüm ihtiyaçlarınız için uygun olacaktır ve size yardımcı olabilir.

+0

Cevabınız için teşekkür ederiz. Bu ilginç bir yaklaşımdır, ancak benim görüş modelimde özellik türünü değiştirmeyi gerektirmediğinden dönüştürücüyü daha basit bir çözüm olarak görüyorum. Bunu söyledikten sonra, ilk etapta neden bu bölümü özledim diye bir dönüştürücü kullanmadığımı vurguladım. Ben sadece bunun StringFormat veya başka bir şeyle XAML'de yapılıp yapılmadığını öğrenmek istedim. – tolism7

İlgili konular