WPF Modifica ore e minuti di un DateTime
Domanda
Ho 3 caselle di testo a modifica un DateTime . Ciò che è importante da notare è che quei 2 TextBoxes stanno modificando l'ora ei minuti del primo valore TextBox DateTime. Uno per modificare la data e 2 per modificare l'ora ei minuti. Come hai fatto? Il codice qui sotto non riflette il DateTime cambia quando si modifica l'ora o minuto, perché fa ToString ( "HH") e il valore DateTime viene perso:
<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\}}" />
Certo che può avere un ViewModel come DataContext dove vorrei risolverlo a livello di codice. Ma io voglio solo sapere se c'è qualche possiblity direttamente in XAML
Soluzione
Non è facilmente possibile solo con XAML. Ci sono varie possibilità come risolvere questo:
1. controllo personalizzato di scrittura o di controllo utente che può fare questo
Si potrebbe wirte un controllo personalizzato / controllo utente (ad esempio DateTimeTextBox) che ha un DateTime Value
proprietà che il codice XAML può legare contro e che contiene la logica per convertire al valore datetime inserito in uno dei suoi due caselle di testo. Invece di due caselle di testo si potrebbe anche avere qualcosa di simile MaskedTextBox.
2. Due proprietà dedicati nel ViewModel
Se si va con MVVM si potrebbe dare al vostro ViewModel due proprietà dedicati int DateTimeHours
int DateTimeMinutes
e si legano contro che:
<TextBox Text="{Binding MyDateTimeHours}" />
<TextBox Text="{Binding MyDateTimeMinutes}" />
Il tuo ViewModel sarebbe quindi unire i due oggetti da un unico valore DateTime.
Altri suggerimenti
Sarà necessario utilizzare un convertitore con 2 modo vincolante e un parametro del convertitore. Salvare l'ora originale nel convertitore. Quindi è possibile aggiornare l'origine vincolante in modo appropriato.
Mi rendo conto questo è un vecchio post, ma mi sono imbattuto in questo oggi e ha trovato un altro modo per attacchi manico con data e ora.
Ho creato una classe parziale chiamata dateTime con 4 proprietà uno per la data, per 1 ora e un'altra per minuti. Poi una sola lettura dateTime proprietà che restituisce una data completata.
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
Poi nel XAML ho usato un layout griglia con le associazioni ad un DateTimePicker e un paio di ComboBoxes.
<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>
Poi per visualizzare la data e l'ora corrette nel dire che un blocco di testo è possibile utilizzare
<TextBlock Text="{Binding dateTime.dateTime, StringFormat={}{0:dd MMM yyyy - HH:mm}}"/>
Spero che questo aiuti qualcun altro fuori.