如何使用自定义格式在XAML中格式化TimeSpan
?我想要小时和分钟。
基于official documentation,在C#中执行此操作的方式应为:
interval.ToString(@"h\:mm");
但是,我希望能够从绑定中以XAML格式格式化TimeSpan
。 This solution似乎可行,但我想创建一个通用转换器,可以将格式字符串传递到其中。我的转换器如下:
public class TimeSpanFormatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
string result = "";
if (value == null)
{
return null;
}
if (parameter == null)
{
return value;
}
if (value is TimeSpan timeSpan)
{
try
{
result = timeSpan.ToString((string)parameter);
}
catch (Exception e)
{
result = "";
}
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
理论上,我可以按以下方式使用此转换器:
<Page.Resources>
<converters:TimeSpanFormatConverter x:key="TimeSpanConverter"></converters:TimeSpanFormatConverter>
</Page.Resources>
<Grid>
<!-- Some properties omitted for brevity. -->
<ListView>
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:MyModel">
<Grid>
<!-- PROBLEM IS HERE -->
<TextBlock Text="{x:Bind Interval, Converter={StaticResource TimeSpanConverter}, ConverterParameter='h\:mm'}"></TextBlock>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
请注意,“ MyModel”具有一个名为“ Interval”的属性,其类型为“ TimeSpan”。
但是,这不起作用,因为我需要反斜杠。 XAML解析会删除反斜杠,从而将“ h:mm”传递给转换器(我已通过调试器进行了验证)。
它也不喜欢两个反斜杠,因为这会从生成的.g.cs文件中引发编译器错误,并说“ \:”是“无法识别的转义序列”。
反斜杠编码的变体没有奏效。我尝试过:
h:mm
h\:mm
h\\:mm
h\\\:mm
h\:mm
h\\:mm
h\\:mm
h\\:mm
需要放在ConverterParameter
中的神奇的字母串是什么?
作为替代方案,here中解释的MultiBinding解决方案看起来很有希望,但是根据Visual Studio的说法,UWP不支持MultiBinding。
答案 0 :(得分:0)
因为我需要反斜杠。 XAML解析会删除反斜杠,从而将“ h:mm”传递给转换器(我已通过调试器进行了验证)。
是的,没错,ConverterParameter
是对象而不是字符串,这可能导致xaml解析时反斜杠被删除。我认为您可以为StringFormat
创建TimeSpanFormatConverter
属性,并在Format
初始化时传递Converter
。
public class TimeSpanFormatConverter : IValueConverter
{
public string StringFormat { get; set; }
public object Convert(object value, Type targetType, object parameter, string language)
{
string result = "";
if (value == null)
{
return null;
}
if (parameter == null)
{
return value;
}
if (value is TimeSpan timeSpan)
{
try
{
result = timeSpan.ToString(StringFormat);
}
catch (Exception e)
{
result = "";
}
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
用法
<Page.Resources>
<local:TimeSpanFormatConverter x:Key="TimeSpanConverter" StringFormat="h\:mm"/>
</Page.Resources>
<Grid>
<TextBlock VerticalAlignment="Center" Text="{x:Bind Interval, Converter={StaticResource TimeSpanConverter},Mode=TwoWay}"></TextBlock>
</Grid>