2010-05-21 6 views
0

У меня есть 3 TextBoxes до Редактировать DateTime. Важно отметить, что те 2 текстовые поля редактируют час и минуты первого значения DateTime TextBox. Один для редактирования даты и 2 для редактирования часа и минут. Как вы это сделаете? Приведенный ниже код не отражает изменения DateTime при редактировании час или минуту, потому что она делает ToString («HH») и значение DateTime теряется:WPF Редактировать часы и минуты 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

ответ

1

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

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

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

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

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

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

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

+0

Давайте поговорим о 3 .: Ну, проблема в том, что я не могу объединить его с фактическим DateTime, потому что эти часы и минуты являются частью первого DateTime! Поэтому мне нужно предоставить недавнюю DateTime методу ConvertBack. –

+0

Да, вы правы, это нелегко. Я удалил эту идею – bitbonk

+0

Да, я знаю .. мне кажется, что некоторые проблемы не могут быть преодолены без MVVM. –

0

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

+0

Ну, если это правда, я бы хотел увидеть пример этого конвертера. ConverteBack: у вас есть только строковое значение (скажем, «16»), как бы вы получили от него всю дату? –

+0

Это не сработает, потому что у вас нет никакого текущего значения DateTime (в целом), и поэтому вы не можете объединить часы/минуты с ним.Вы также не сохраняете какое-либо состояние в конвертере, потому что один и тот же экземпляр можно использовать несколько раз. – bitbonk

+0

Создайте пользовательский элемент управления с текстовым полем в нем и сохраните его вот так? – Snake

0

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

Я создал частичный класс, называемый 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 и пару 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 Text="{Binding dateTime.dateTime, StringFormat={}{0:dd MMM yyyy - HH:mm}}"/> 

Надеется, что это помогает кто-то еще.