如何格式化wpf中的转换器参数

时间:2015-10-08 04:59:22

标签: c# wpf

我的xaml代码如下,

   <TextBox
             Text="{Binding Path=TimeDuration,
                            ConverterParameter='hhmm',
                            Converter={StaticResource HoursMinutesTimeSpanConverter}}"/>

转换器代码,

[ValueConversion(typeof(TimeSpan), typeof(String))]
public class HoursMinutesTimeSpanConverter : IValueConverter
{
    /// <summary>Converts the value into a time only formatted string.</summary>
    /// <param name="value"> The value. </param>
    /// <param name="targetType"> The target type. </param>
    /// <param name="parameter"> The parameter. </param>
    /// <param name="culture"> The culture. </param>
    /// <returns>Time string value. </returns>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((TimeSpan)value).ToString(parameter.ToString());
    }


    /// <summary>Converts the hours minutes string back to the time span value.</summary>
    /// <param name="value"> The value. </param>
    /// <param name="targetType"> The target type. </param>
    /// <param name="parameter"> The parameter. </param>
    /// <param name="culture"> The culture. </param>
    /// <returns>Time string value. </returns>
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return TimeSpan.ParseExact((string)value, parameter.ToString(), CultureInfo.CurrentCulture);
    }
}

工作正常。其实我需要给这个&#34; hh:mm&#34;作为转换器中正确格式化的参数。

我试过这个

  

ConverterParameter =&#39; hh {转义字符代码} mm&#39;为角色提供代码

注意:我输入的方式是因为html中的代码没有反映在我的帖子中,所以为什么会这样做)

引用此link

它不适用于我的情况。如何解决这个问题。

提前致谢。

4 个答案:

答案 0 :(得分:3)

您可以使用此StringFormat获取该输出:

<TextBox Text="{Binding TimeDuration, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}" />

更新:

  

TimeSpan 表示时间间隔,而不是一天中的某个时间,因此始终如此   24小时格式&amp;没有HH的格式。

     

然而,使用 DateTime hh将以12小时格式显示小时数   如果你想要24小时格式,你应该使用HH

此外,我考虑的TimeDuration类型为TimeSpan

答案 1 :(得分:1)

From the docs

  

自定义TimeSpan格式说明符不包括占位符分隔符符号,例如将小时数与小时数,小时数与分数小时数或秒数与小数秒数分隔开的符号。相反,这些符号必须作为字符串文字包含在自定义格式字符串中。例如,&#34; dd.hh:mm&#34;将句点(。)定义为天和小时之间的分隔符,并将冒号(:)定义为小时和分钟之间的分隔符。

像这样使用:

Text="{Binding Path=TimeDuration,
                            ConverterParameter='hh\\:mm',
                            Converter={StaticResource HoursMinutesTimeSpanConverter}}

通过这种方式,您可以使用自己喜欢的任何分隔符。

注意:需要逃避&#39; \&#39;使用双斜杠(&#39; \\&#39;),因为ConverterParameter值位于&#34;代码空间&#34;并遵循正常的C#字符串文字规则,而不是&#34;标记空间&#34;与问题中的link一样。

答案 2 :(得分:0)

冒号需要用反斜杠进行转义,即

TimeSpan.FromHours(5.25).ToString(@"hh\:mm")

试试这个:

/// <summary>Converts the value into a time only formatted string.</summary>
/// <param name="value"> The value. </param>
/// <param name="targetType"> The target type. </param>
/// <param name="parameter"> The parameter. </param>
/// <param name="culture"> The culture. </param>
/// <returns>Time string value. </returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var escapedFormatString = parameter.replace(@":", @"\:");
    return ((TimeSpan)value).ToString(escapedFormatString);
}

这应该有效:

<TextBox Text="{Binding Path=TimeDuration,
                        ConverterParameter='hh:mm',
                        Converter={StaticResource HoursMinutesTimeSpanConverter}}"/>

答案 3 :(得分:0)

我知道了。

应该是这样的

  

ConverterParameter =&#39; HH \\:毫米&#39;

字符串中有两个反斜杠。而尼基塔也表示不需要转换器。这种方法很好。