【问题标题】:How to format converter parameter in WPF如何在 WPF 中格式化转换器参数
【发布时间】:2015-10-08 04:59:21
【问题描述】:

我的 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);
    }
}

它工作正常。实际上,我需要将此 hh\:mm 作为参数,以便在转换器中正确格式化。

我试过了:

>  ConverterParameter='hh{escape character code here}mm' giving codes for the characters

注意:我是这样输入的,因为那是 html 中的代码,它没有反映在我的帖子中,所以为什么。

通过引用:link

在我的情况下它不起作用。如何解决这个问题。

提前致谢。

【问题讨论】:

  • 能把转换器的代码发一下HoursMinutesTimeSpanConverter吗?
  • ContentStringFormat="{}{0}:"
  • @RahulTripathi 您能否发布完整的 xaml 行。因为它是一个 ConverterParameter 所以很困惑在哪里给出这个代码。
  • 你可以使用 stringFormat 代替转换器。
  • 为什么/什么在您的情况下不起作用?

标签: c# wpf


【解决方案1】:

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

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

更新:

TimeSpan 表示时间间隔而不是一天中的时间,所以它总是 24 小时格式 & 没有HH 的格式。

而对于 DateTimehh 将以 12 小时格式显示小时 如果你想要 24 小时格式,你应该使用HH

另外,我考虑的 TimeDuration 类型是TimeSpan

【讨论】:

  • 我给 HH 它没有给出结果
  • @shan 我用 hh 试过,它给出了 24 小时格式,我已经更新了句子。你需要 12 小时制吗?
【解决方案2】:

From the docs:

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

这样使用:

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

这样你就可以使用任何你喜欢的分隔符了。

注意:由于ConverterParameter 值在“代码空间”中并遵循正常的 C# 字符串文字规则,因此需要使用双斜杠 ('\\') 转义 '\' ,而不是像问题中的link那样在“标记空间”中。

【讨论】:

  • 我试过了,但它不起作用。它会引发错误和 xaml 页面崩溃。它对你有用吗?
  • 如果我在转换器中的 C# 代码 'hh\:mm' 中给出相同的值,例如 ((TimeSpan)value).ToString("hh\:mm") 它的工作原理。
  • 我现在无法测试,也许您需要在标记中添加双斜杠。稍后我会验证。
  • 感谢阿米特的回答。是的,我尝试使用双斜杠,它开始工作了。 :)
【解决方案3】:

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

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}}"/>

【讨论】:

    【解决方案4】:

    我想通了。

    应该是这样的

    ConverterParameter='hh\\:mm'

    字符串中的两个反斜杠。正如尼基塔所说,不需要转换器。这种方法很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多