我想显示有关指定时间尺度(例如小时、分钟、秒)的时间信息。此信息显示在列表框的项目中。为此,我为 ListBoxItem-s 创建了一个自定义 ControlTemplate,例如:
<ControlTemplate TargetType="ListBoxItem">
<Controls:ExtendedTextBlock x:Name="time" d:LayoutOverrides="Width">
<Controls:ExtendedTextBlock.Text>
<MultiBinding Converter="{StaticResource scaledDateToStringConverter}" FallbackValue="">
<Binding Path="Time"></Binding>
<Binding Path="TimelineScale"></Binding>
</MultiBinding>
</ControlTemplate>
转换器执行以下操作:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var scale = (TimelineScale)values[1];
var timestamp = (DateTime)values[0];
string convertedTimestamp;
if (timestamp == default(DateTime))
{
convertedTimestamp = "LIVE";
}
else
{
switch (scale)
{
case TimelineScale.Seconds:
convertedTimestamp = timestamp.ToString("T", CultureInfo.CurrentCulture);
break;
case TimelineScale.Minutes:
convertedTimestamp = timestamp.ToString("t", CultureInfo.CurrentCulture);
break;
case TimelineScale.Hours:
convertedTimestamp = timestamp.AddMinutes(-timestamp.Minute).AddSeconds(-timestamp.Second).ToString("t", CultureInfo.CurrentCulture);
break;
default:
convertedTimestamp = timestamp.ToString("T", CultureInfo.CurrentCulture);
break;
}
}
return convertedTimestamp;
}
问题是,对于某些项目,Convert 方法被调用不止一次,并且在第一次调用时,而不是实际时间值 -DependencyProperty.UnsetValue 作为参数传递,在从输入数组中拆箱值期间导致 InvalidCastException。我怎样才能只实现一次转换并且(至少)使用有效参数?
关于这个问题有一些有趣的评论: 时间的价值是明确定义的。自从 .NET 版本以来,此代码已经运行了很长时间。4.0 但问题现在才出现(至少它开始不断地被客户和我们的测试机器复制)