2010-05-21 722 views
0

我有3個文本框到編輯日期時間。 需要注意的是,這2個文本框正在編輯第一個TextBox DateTime值的小時和分鐘。 一個編輯日期和2個編輯小時和分鐘。 你會怎麼做?下面的代碼編輯小時或分鐘時,並不反映日期時間的變化,因爲它的ToString(「HH」)和日期時間值丟失:WPF編輯日期時間的小時和分鐘

<TextBox Text="{Binding MyDateTime}" /> 

    <!--This cannot work : it's just for clearing purposes --> 
    <TextBox Text="{Binding MyDateTime, StringFormat=\{0:HH\}}}" /> 
    <TextBox Text="{Binding MyDateTime}, StringFormat=\{0:mm\}}" /> 

當然我可以有一個視圖模型作爲其中的DataContext我會以編程方式解決它。 但我只想知道是否有任何可能性直接在XAML中

回答

1

只用XAML並不容易。有幾種可能性,怎麼解決這個問題:

1.有一個屬性DateTime Value寫自定義控件或用戶控件可以做到這一點

你可以WIRTE一個自定義的控制/用戶控制(例如DateTimeTextBox),其你的xaml可以綁定並且包含邏輯來轉換爲在其兩個文本框之一中輸入的日期時間值。而不是兩個文本框,你也可以有像maskedtextbox這樣的東西。

<TextBox Text="{Binding MyDateTimeHours}" /> 
<TextBox Text="{Binding MyDateTimeMinutes}" /> 

您的視圖模型將然後合併:在視圖模型

如果你有MVVM去,你可以給你的視圖模型兩個專用的性能int DateTimeHoursint DateTimeMinutes和綁定針對

2.兩個專用的屬性這兩個屬性爲單個DateTime值。

+0

讓我們來談談3:那麼問題是我無法將它與實際的DateTime合併,因爲這些小時和分鐘是第一個DateTime的一部分!所以我需要將最近的DateTime提供給ConvertBack方法。 – 2010-05-21 08:20:29

+0

是的,你是對的,這是不容易的。我刪除了這個想法 – bitbonk 2010-05-21 08:22:10

+0

是的..你知道..在我看來,如果沒有MVVM就無法克服一些問題。 – 2010-05-21 08:43:39

0

您將需要使用具有2way綁定和轉換器參數的轉換器。將最初的小時保存在Converter中。然後,您可以適當地更新綁定源。

+0

好吧..如果是真的,我希望看到該轉換器的一個例子。 ConverteBack:你只有一個字符串值(比如說「16」),你將如何從它得到整個Date? – 2010-05-21 08:17:35

+0

這不會起作用,因爲您沒有任何對當前DateTime值的訪問權限(整體),因此您無法將小時/分鐘與它合併。您也不會在轉換器中保存任何狀態,因爲可以多次使用相同的實例。 – bitbonk 2010-05-21 08:24:13

+0

使用其中的文本框創建一個用戶控件並保存它? – Snake 2010-05-21 08:32:43

0

我很欣賞這是一箇舊帖子,但今天我發現了這個,並找到了另一種處理日期和時間綁定的方法。

我創建了一個名爲dateTime的部分類,其中4個屬性爲日期,1個爲小時,另一個爲分鐘。然後返回一個完成日期的只讀dateTime屬性。

Partial Public Class dateTimeValue 
     Property Dt As Date 
     Property Hr As Integer 
     Property Mn As Integer 

     ReadOnly Property dateTime As Date 
      Get 
       Dim d = Dt 
       d = d.AddHours(d.Hour * -1).AddHours(Hr) 
       d = d.AddMinutes(d.Minute * -1).AddMinutes(Mn) 
       d = d.AddSeconds(d.Second * -1) 
       Return d 
      End Get 
     End Property 
    End Class 

然後在XAML我使用了網格佈局與綁定一個DateTimePicker和一對夫婦組合框的。

  <UniformGrid Columns="2"> 
       <TextBlock Text="Date"/> 
       <DatePicker SelectedDate="{Binding dateTime.Dt}"/> 
       <TextBlock Text="Time"/> 
       <WrapPanel> 
        <ComboBox SelectedValue="{Binding dateTime.Hr}" SelectedValuePath="Content"> 
         <ComboBoxItem>00</ComboBoxItem> 
         <ComboBoxItem>01</ComboBoxItem> 
         <ComboBoxItem>02</ComboBoxItem> 
         ......... 
         <ComboBoxItem>22</ComboBoxItem> 
         <ComboBoxItem>23</ComboBoxItem> 
        </ComboBox> 
        <TextBlock Text=":"/> 
        <ComboBox SelectedValue="{Binding dateTime.Mn}" SelectedValuePath="Content"> 
         <ComboBoxItem>00</ComboBoxItem> 
         <ComboBoxItem>15</ComboBoxItem> 
         <ComboBoxItem>30</ComboBoxItem> 
         <ComboBoxItem>45</ComboBoxItem> 
        </ComboBox> 
       </WrapPanel> 
       <Button Click="saveTask" Content="Save Task"/> 
      </UniformGrid> 

然後顯示在說一個文本塊正確的日期和時間,你可以使用

<TextBlock Text="{Binding dateTime.dateTime, StringFormat={}{0:dd MMM yyyy - HH:mm}}"/> 

希望這可以幫助其他人了。

相關問題