XAML数据绑定和动态字符串格式

时间:2012-11-20 03:28:09

标签: c# xaml binding string-formatting

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

假设我有一个属性大小:

    /// <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 “还有那么大的数字。

我如何“动态”更改stringformat?

请记住,文本块被封装在一个由ObservableCollection限定的LongListSelector中,因此只需获取文本块并更改文本将无法工作,因为如果您知道我的意思,将会有大量使用textblock格式的对象。 / p>

感谢。

1 个答案:

答案 0 :(得分: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}" ...