在数据绑定时格式化显示的字符串时遇到一些麻烦。
假设我有一个属性大小:
/// <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>
感谢。
答案 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}" ...