WPF bearbeiten Stunden und Minuten von einem DateTime-
Frage
Ich habe 3 Textfelder auf Bearbeiten eines Datetime . Was Mitteilung wichtig ist, ist, dass diese zwei Textfelder bearbeiten die Stunden und Minuten des ersten TextBox Datetime-Wertes. Ein Datum und 2 bis bearbeiten Stunden und Minuten zu bearbeiten. Wie würdest du das machen? Der folgende Code entspricht nicht der Datetime ändert sich, wenn die Stunde oder Minute bearbeiten, weil es tut ToString ( „HH“) und der Datetime-Wert ist verloren:
<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\}}" />
Natürlich kann ich ein Ansichtsmodell als Datacontext, wo ich es programmatisch lösen würde. Aber ich will nur wissen, ob es eine Möglichkeit direkt in XAML ist
Lösung
Es ist nicht ohne weiteres möglich, mit XAML nur. Es gibt mehrere Möglichkeiten, wie diese zu lösen:
1. Write-Steuerelement oder Benutzersteuerung, die diese
tun kann Sie können eine individuelle Steuerung / Benutzerkontrolle wirte (z DateTimeTextBox), das eine Eigenschaft DateTime Value
hat, dass Ihr XAML gegen binden kann und dass enthält Logik zu konvertieren auf den Wert Datetime eingegeben in einem seiner beiden Textfelder. Anstelle von zwei Textfelder können Sie auch so etwas wie MaskedTextBox haben.
2. Zwei spezielle Eigenschaften im Ansichtsmodell
Wenn Sie mit MVVM gehen könnten Sie Ihre Ansichtsmodell zwei spezielle Eigenschaften int DateTimeHours
int DateTimeMinutes
geben und binden gegen diese:
<TextBox Text="{Binding MyDateTimeHours}" />
<TextBox Text="{Binding MyDateTimeMinutes}" />
Ihr Ansichtsmodell würde dann verschmilzt die beiden Eigenschaften in einem einzigen Datetime-Wert.
Andere Tipps
Sie benötigen einen Konverter mit 2 Art und Weise zu verwenden, Bindung und einem Konverter Parameter. Speichern Sie die Original-Stunde in dem Converter. Dann können Sie die Bindungsquelle entsprechend aktualisieren.
Ich schätze das ist eine alte Post, aber ich kam in dieser heute und fand eine andere Art und Weise zu handhaben Bindungen mit Datum und Uhrzeit.
habe ich eine partielle Klasse Datums- und Uhrzeit mit 4 Eigenschaften eines für das Datum, 1 Stunde und eine weitere für Minuten genannt. Dann wird eine Nur-Lese-Datums- und Uhrzeit Eigenschaft, dass die Rendite eines Abschlussdatum.
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
Dann in der XAML habe ich ein Raster-Layout mit den Bindungen an ein Datetimepicker und ein paar Comboboxen.
<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>
Dann das korrekte Datum und die Uhrzeit anzuzeigen, um einen Textblock in sagen Sie verwenden können,
<TextBlock Text="{Binding dateTime.dateTime, StringFormat={}{0:dd MMM yyyy - HH:mm}}"/>
Hope dies jemand anderes heraus hilft.