DateTime的WPF编辑小时和分钟
题
我有3个文本框 编辑DateTime。重要的是要注意的是,这两个文本框正在编辑第一个TextBox DateTime值的小时和分钟。一个用于编辑日期,2个编辑小时和分钟。你会怎么做?下面的代码在编辑小时或分钟时不会反映日期时间的变化,因为它确实会发生ToString(“ HH”),并且丢失了DateTime值:
<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\}}" />
当然,我可以将ViewModel作为DataContext,可以在其中以编程方式解决它。但是我只想知道XAML中是否有任何可能性
解决方案
仅XAML不容易。解决这个问题有几种可能性:
1.编写可以执行此操作的自定义控件或用户控件
您可以使用具有属性的自定义控制 /用户控制(例如DateTimeTextbox) DateTime Value
您的XAML可以绑定,并且包含逻辑以将其转换为其两个文本框之一输入的DateTime值。您也可以使用MaskedTextbox之类的东西,而不是两个文本框。
2. ViewModel中的两个专用属性
如果您使用MVVM,则可以给您的ViewModel两个专用属性 int DateTimeHours
int DateTimeMinutes
并与之约束:
<TextBox Text="{Binding MyDateTimeHours}" />
<TextBox Text="{Binding MyDateTimeMinutes}" />
然后,您的ViewModel将将两个属性合并到单个DateTime值。
其他提示
您将需要使用具有2way绑定和转换器参数的转换器。将原始小时保存在转换器中。然后,您可以适当地更新绑定源。
我很欣赏这是一篇古老的帖子,但是今天我遇到了这一点,并找到了另一种与日期和时间处理绑定的方法。
我创建了一个名为DateTime的部分类别,该类别具有4个属性,一个日期为1个小时,另一个属性为1分钟。然后返回完整日期的Readonly 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的绑定和几个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>
然后,要显示正确的日期和时间,请说textblock可以使用
<TextBlock Text="{Binding dateTime.dateTime, StringFormat={}{0:dd MMM yyyy - HH:mm}}"/>
希望这对别人有帮助。