2013-11-25 67 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

只有解決方案,爲我工作以及 –