0

只是在数据绑定时格式化显示的字符串时遇到了一些麻烦。

假设我有一个属性大小:

    /// <summary>
    /// Size information
    /// </summary>
    private long _size;
    public long Size
    {
        get
        {
            return _size;
        }
        set
        {
            if (value != _size)
            {
                _size = value;
                NotifyPropertyChanged("Size");
            }
        }
    }

而这个大小是一个代表字节数的整数。我想根据整数的大小显示一个表示大小的值。例如:

Size = 1 byte
Size = 1 kilobyte
Size = 100 megabytes

这是我的 TextBlock 的 XAML:

<TextBlock Text="{Binding Size, StringFormat='Size: {0}'}" TextWrapping="Wrap" Margin="12,110,0,0" Style="{StaticResource PhoneTextSubtleStyle}" Visibility="{Binding Visible}" FontSize="14" Height="20" VerticalAlignment="Top" HorizontalAlignment="Left" Width="200"/>

截至目前,它只显示“大小:50”,意思是 50 个字节,但我希望它显示“大小:50 字节/千字节/兆字节”(无论哪个合适),否则我会得到“大小:50000000000000”和巨大的像这样的数字。

我将如何“动态”更改字符串格式?

请记住,文本块被封装在由 ObservableCollection 限制的 LongListSelector 中,因此如果您知道我的意思,那么简单地获取文本块并更改文本将不起作用,因为会有大量使用文本块格式的对象。

谢谢。

4

1 回答 1

0

就我而言,我使用了一些技巧。我将视图绑定到一个 viewModel,其中包含一个包含格式化值的附加字符串属性。例如,像这样:

//using short scale: http://en.wikipedia.org/wiki/Long_and_short_scales#Comparison
const decimal HundredThousand = 100 * 1000;
const decimal Million = HundredThousand * 10;
const decimal Billion = Million * 1000; //short scale
const decimal Trillion = Billion * 1000; //short scale

const string NumberFormatKilo = "{0:##,#,.## K;- ##,#,.## K;0}";
const string NumberFormatMillion = "{0:##,#,,.## M;- ##,#,,.## M;0}";
const string NumberFormatBillion = "{0:##,#,,,.## B;- ##,#,,,.## B;0}";
const string NumberFormatTrillion = "{0:##,#,,,,.## T;- ##,#,,,,.## T;0}";

public decimal Size 
{
    get; set;
}

public string SizeFormatted 
{
    get 
    {
        var format = GetUpdatedNumberFormat(Size);
        return string.Format(format, Size);
    }
}

private static string GetUpdatedNumberFormat(decimal value)
{
    string format = NumberFormat;
    if (Math.Abs(value) >= Constants.Trillion)
        format = NumberFormatTrillion;
    else if (Math.Abs(value) >= Constants.Billion)
        format = NumberFormatBillion;
    else if (Math.Abs(value) >= Constants.Million)
        format = NumberFormatMillion;
    else if (Math.Abs(value) >= Constants.HundredThousand)
        format = NumberFormatKilo;
    return format;
}

现在,将视图绑定到此SizeFormatted属性:

<TextBlock Text="{Binding SizeFormatted}" ...
于 2012-11-20T03:45:01.173 回答