我有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}}"/>

希望这对别人有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top