【问题标题】:StringFormat for binding TimeSpan in XAML does not work用于在 XAML 中绑定 TimeSpan 的 StringFormat 不起作用
【发布时间】:2013-12-10 03:23:21
【问题描述】:

我有一个名为 Time 的 TimeSpan 变量,我成功地在 XAML 中绑定了它。这是我的代码:

...
<TextBlock Grid.Column="2" Text="{Binding Time, StringFormat='{}{0:hh:mm}'}" />
...

现在可以正确显示值,但是格式仍然是 hh:mm:ss。我试图摆脱秒,只显示小时和分钟,但由于某种原因,我对 StringFormat 所做的更改没有被考虑在内,我总是得到相同的 hh:mm:ss 格式。可以请教吗?

谢谢!

编辑:

从下面的 cmets 来看,我绑定的时间似乎不是 TimeSpan 格式,因为 StringFormat 似乎是正确的,但显示的值是错误的。 Time变量在自定义类Record中定义如下:

        private TimeSpan time;
        public TimeSpan Time
        {
            get { return time; }
            set { time = value; }
        }

在我的代码中,我定义了一个可观察的集合:

ObservableCollection<Record> records = new ObservableCollection<Record>();

集合是填充的然后我有:

listBoxRecords.ItemsSource = this.records;

这是完整的 XAML,请记住,其余字段已正确填充,只有 TimeSpan 给我带来了麻烦:

<ListBox Margin="0,44,0,58" Name="listBoxRecords" ItemsSource="{Binding records}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="4">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="120" />
                            <ColumnDefinition Width="85" />
                            <ColumnDefinition Width="55" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding Date, StringFormat='{}{0:dd-MM-yyyy HH:mm}'}" />
                        <TextBlock Grid.Column="1" Text="{Binding Type }" />
                        <TextBlock Grid.Column="2" Text="{Binding Time, StringFormat='{}{0:hh\\:mm}'}" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

【问题讨论】:

  • 如果您的问题现在已经解决,请按照本网站的惯例accept an answer
  • 问题还没有解决,否则我很乐意接受答案。
  • 当您尝试我的回答时,会发生什么(请记住我的评论,即您看到的内容不是来自我的StringFormat)?在一个新项目中尝试一下,你会发现它工作得很好。

标签: c# wpf xaml


【解决方案1】:

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

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

更新>>>

我要说明的第一点是hh 将以 12 小时格式显示小时,如果您想要 24 小时格式,您应该使用 HH

我想说的第二点是,您显然对自己在应用程序中所做的事情感到困惑。您在秒值中看到的时间值不是来自此TextBlock,也可能不是来自您的时间值。我认为你需要好好看看你的代码......你必须有另一个TextBlock或其他东西。

【讨论】:

  • 打印相同的字符串两次,例如 12:32:0012:32:00。
  • 您似乎将这个StringFormat 与另一个混淆了......例如,这个StringFormat 中没有秒数,所以它从不显示秒数你在评论中的例子。在我的应用程序中,它的显示完全符合预期。
  • 不幸的是,我可以确认它不能以这种方式工作,并且我的结果与“mmvsbg”相同。目前我在一个 net35 项目上,也许它确实按照你在 net40 或 net45 项目上建议的方式工作。
  • @Sheridan 在带有 .NET 4.5 的 WPF 中对我来说完全失败,在一个新项目中。 "'StringFormat' 转换器转换值失败"
  • 这工作:&lt;TextBlock Text="{Binding MyTimeSpanProperty, StringFormat='{}{0:hh\\:mm\\:ss}'}"/&gt;
【解决方案2】:

尝试通过将 StringFormat 更改为类似以下内容来转义 :

StringFormat='{}{0:hh\\:mm}'

【讨论】:

  • 我试过 但仍然没有成功。
  • 我已经在 TimeSpan 属性上尝试了我的代码,它运行良好,但真正奇怪的是,在你的情况下,你说,它忽略了 StringFormat 并在我的情况是你的代码什么也没显示。您是否 100% 确定您已绑定到您认为绑定到的 TimeSpan Time {...} 属性。
  • 事实上,我已经在网上看到了您的解决方案,但我很惊讶它没有奏效。我有一个 类型的 ObservableCollection,它有一个 TimeSpan 类型的属性 Time。名为“records”的集合被设置为显示它的 ListBox 的 ItemsSource,并且 ListBox 本身有一个 ItemsSource="{Binding records}。我假设它一切正常,因为 MyClass 中的其余字段已正确显示在 ListBox 和 TimeSpan 值本身是正确的 - 除了我想隐藏秒,因为不需要在 UI 上显示它们。
  • 你能用MyClass的定义更新你的问题吗,主要是Time属性是如何定义的?从您对其他答案的评论来看,StringFormat 被忽略了,因为它不是TimeSpan。除了默认的 TimeSpan 格式将是 hh:mm:ss.fffffff 并且您缺少毫秒部分
  • @mmvsbg,我看到了你的更新,一切似乎都井井有条。我看不到任何明显的东西。我还检查了 MSDN.fffffff 实际上是可选的,如果你有完整的秒数可能不包括在内,所以你得到的也可能是 TimeSpan 的默认格式
【解决方案3】:

所有建议的答案都不适合我,它们都会产生绑定错误。 我最终制作了一个示例应用程序来测试在MSDN: Custom TimeSpan Format Strings 上找到的所有可能的字符串格式

我从这个测试中发现,只有以 % 开头的 TimeSpan 部分(如 %d for Days)在 WPF StringFormat 属性中有效。

试试这个,它对我有用:

<TextBlock
    Text="{Binding Path=Time,
        StringFormat={}{0:%d} days {0:%h} hours {0:%m} minutes,
        FallbackValue=0 days 0 hours 0 minutes}" />

【讨论】:

    【解决方案4】:

    来自 .Net 4 的您可以使用的时间跨度

        <TextBlock Grid.Column="2" Text="{Binding Time, StringFormat=hh\\:mm\\:ss}" />
    

    至于 tim-lloyd 的回答 How to format TimeSpan in XAML

    如果有效,标记为答案。

    问候

    【讨论】:

      【解决方案5】:

      对于那些对程序化方法感兴趣的人,这对我有用:

              {
                  DataGridTextColumn dgtc = new DataGridTextColumn();
                  dgtc.Header = "End Time";
                  dgtc.Binding = new Binding("EndTime");
                  dgtc.Binding.StringFormat = "{0:hh}:{0:mm}";
                  ScheduleGrid.Columns.Add(dgtc);
              }
      

      【讨论】:

        【解决方案6】:

        搜索了很多关于这个问题的线程,我发现: 截至 2019 年 7 月 4 日,这适用于 Xamarin 形式的 XAML:

        Text="{Binding myTimeSpan, StringFormat=\{0:h\\:mm\\:ss\}, FallbackValue=00:00:00}

        它以时、分、秒显示时间:

        1 小时 23 分 9 秒 = 1:23:09

        【讨论】:

        • 6 年后!我认为我什至没有将原始代码保留在某个地方进行测试...
        猜你喜欢
        • 2014-12-27
        • 1970-01-01
        • 2011-03-28
        • 2010-09-16
        • 2014-06-13
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 2016-09-09
        相关资源
        最近更新 更多