Вопрос

У меня есть 3 текстовых ящика Редактировать datetime.Отказ Важно отметить, что те 2 текстовые ящики редактируют час и минуты первого значения Textbox DateTime. Один для редактирования даты и 2 для редактирования часов и минут. Как бы Вы это сделали? Ниже приведен код не отражает изменение DateTime при редактировании часа или минуты, потому что он делает ToString («HH»), а значение TOTETIME потеряно:

 <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. Написать пользовательский контроль или контроль пользователя, который может сделать это

Вы можете Wirte пользовательский контроль / пользовательский контроль (например, DateTimetextBox), который имеет свойство DateTime Value То, что ваш XAML может связываться против и что содержит логику для преобразования в значение TANETIME, введенное в одном из двух текстовых ящиков. Вместо двух текстовых ящиков вы также можете иметь что-то вроде MaskedTextBox.

2. Две выделенные свойства в ViewModel

Если вы идете с MVVM, вы могли бы дать вашему просмотру два выделенных свойства int DateTimeHours int DateTimeMinutes и связываться против этого:

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

Ваш ViewModel затем объединит два свойства в одно значение DateTime.

Другие советы

Вам нужно будет использовать конвертер с 2way Binding и параметр преобразователя. Сохраните оригинальный час в преобразователе. Затем вы можете обновить источник привязки соответствующим образом.

Я ценю это старый пост, но я сегодня столкнулся с этим и нашел другой способ справиться с привязками с датой и временем.

Я создал частичный класс, называемый DateTime с 4 свойствами один на дату, 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 и пару комбикордов.

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

Надеюсь, это поможет кому-то другому.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top