WPF Редактировать часы и минуты DateTime - PullRequest
0 голосов
/ 21 мая 2010

У меня есть 3 текстовых поля для редактирования DateTime . Важно отметить, что эти 2 текстовых поля редактируют час и минуты первого значения DateBime TextBox. Один для редактирования даты и 2 для редактирования часов и минут. Как бы Вы это сделали? Приведенный ниже код не отражает изменения DateTime при редактировании часа или минуты, поскольку он выполняет 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

Ответы [ 3 ]

1 голос
/ 21 мая 2010

Это не просто возможно только с XAML. Есть несколько способов решить эту проблему:

1. Написать пользовательский элемент управления или пользовательский элемент управления, который может сделать это

Вы можете записать пользовательский элемент управления / пользовательский элемент управления (например, DateTimeTextBox), который имеет свойство DateTime Value, с которым может связываться ваш xaml и которое содержит логику для преобразования в значение даты и времени, введенное в одном из двух его текстовых полей. Вместо двух текстовых полей у вас также может быть что-то вроде maskedtextbox.

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

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

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

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

0 голосов
/ 07 октября 2015

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

Я создал частичный класс dateTime с 4 свойствами: одно для даты, одно для часа и другое для минут. Затем свойство только для чтения 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 и паре ComboBox.

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

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

0 голосов
/ 21 мая 2010

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

...