2013-11-25 42 views
3

我有一个名为Time的TimeSpan变量,我设法在XAML中成功绑定。以下是我的代码:在XAML中绑定TimeSpan的StringFormat不起作用

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

现在值正确显示,但格式仍然是hh:mm:ss。我试图摆脱秒,只显示小时和分钟,但由于某些原因,我对StringFormat所做的更改没有考虑到,而且我总是得到相同的hh:mm:ss格式。你能给些建议么?

谢谢!

编辑:

所作的评论来看下面似乎我已经绑定的时间是不是在时间跨度格式作为的StringFormat似乎是正确的,但显示的数值是错误的。 时间变量被定义为一个自定义类实录如下:

 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> 
+0

如果你的问题现在已得到解决,请[接受一个答案(http://stackoverflow.com/help/someone-answers)按照惯例在这个网站上。 – Sheridan

+1

问题还没有解决,否则我会很乐意接受答案。 – mmvsbg

+0

当你尝试我的答案时,会发生什么(铭记我的评论,你看到的* *不是来自我的'StringFormat')?在一个新项目中尝试一下,你会发现它工作得很好。 – Sheridan

回答

7

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

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

UPDATE >>>

,我想提出的第一点是,hh显示12小时格式的小时,如果你想要24小时格式,你应该使用HH

我想说的第二点是,你对你在应用程序中做什么感到困惑。您看到的秒值为的时间值不是来自这个TextBlock,也可能不是来自您的那个。我认为你需要好好看看你的代码...你必须有另一个TextBlock什么的。

+1

它打印两次相同的字符串,如12:32:0012:32:00。 – mmvsbg

+0

你似乎正在将这个'StringFormat'与另一个...混合在一起......例如,在这个'StringFormat'中没有秒,所以它将永远不会像你的例子那样在你的评论中显示秒。在我的应用程序中,它完全按预期显示。 – Sheridan

+0

不幸的是,我可以确认它不能以这种方式工作,我的结果与'mmvsbg'一样。目前我在一个net35项目中,也许它的工作方式与你在net40或net45项目中建议的方式一致。 –

5

尝试通过改变你的StringFormat到像逃避:

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

我试过但仍然没有成功。 – mmvsbg

+0

我已经在'TimeSpan'属性上试过了我的代码,它工作正常,但是真正奇怪的是,在你的情况下,你说它忽略了'StringFormat',并显示默认格式,而在我的情况下,你的代码什么也没有显示。你是否100%确定你绑定了你认为绑定到的'TimeSpan Time {...}'属性。 – dkozl

+0

事实上,我已经看到你的解决方案在网络中,我很惊讶它没有工作。我有一个类型为的ObservableCollection,它有一个TimeSpan类型的属性Time。被称为'records'的集合被设置为一个ListBox的ItemsSource来显示它,而ListBox本身有一个ItemsSource =“{Binding records}。我假设它一切正常,因为MyClass中的其余字段被正确显示在ListBox和TimeSpan的值本身是正确的 - 除了我想隐藏秒,因为没有必要在UI上显示它们。 – mmvsbg

2

对于那些有兴趣在一个纲领性的方法,这个工作对我来说:

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

所提出的答案都不为我工作,它们都会产生绑定错误。 我最终作出一个示例应用程序来测试MSDN: Custom TimeSpan Format Strings

发现每一个可能的字符串格式我从这个测试,只有时间跨度的部分与%开始发现(如%d为天)曾在WPF StringFormat财产。

试试这个,它的工作对我来说:

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

只有解决方案,为我工作以及 –