2010-05-21 7 views
0

나는 3 개의 TextBox를 가지고 있습니다. 은 DateTime을 편집합니다. 주목해야 할 중요한 점은 두 개의 TextBox가 첫 번째 TextBox DateTime 값의시와 분을 편집하고 있다는 것입니다. 날짜를 편집하려면 1을 입력하고 시간과 분을 편집하려면 2를 입력하십시오. 어떻게 하시겠습니까?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\}}" /> 

내가 DataContext의 경우로 뷰 모델을 가질 수 시간 또는 분을 편집 할 때 ToString ("HH")가 수행하고 날짜 시간 값이 손실되기 때문에 코드는 아래의 날짜 시간 변경을 반영하지 않습니다 나는 그것을 프로그래밍 방식으로 해결할 것이다. 그러나 XAML에 직접 가능성이 있는지 알고 싶습니다.

답변

1

XAML만으로는 쉽게 구현할 수 없습니다. 이 문제를 해결하는 방법을 몇 가지 가능성이 있습니다

1. 재산권 DateTime Value을 가지고이

당신은 사용자 지정 컨트롤/사용자 컨트롤 (예 : DateTimeTextBox를) wirte 할 수 할 수있는 쓰기 사용자 지정 컨트롤 또는 사용자 컨트롤이 xaml은 바인딩 할 수 있으며 두 개의 텍스트 상자 중 하나에 입력 된 datetime 값으로 변환하는 논리를 포함합니다. 두 개의 텍스트 상자 대신에 maskedtextbox와 같은 것을 사용할 수 있습니다.

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

귀하의 ViewModel 다음 병합 것이다 : 뷰 모델

당신이 MVVM 함께 가면 당신이 줄 수있는 당신의 ViewModel 두 개의 전용 특성이에 대한 int DateTimeHoursint DateTimeMinutes와 바인딩의

2 개의 전용 속성 이 두 속성은 단일 DateTime 값에 대한 것입니다.

+0

3시에 대해 이야기 해 봅시다. 문제는 실제 DateTime과 병합 할 수 없다는 것입니다. 그 이유는 시간과 분이 첫 번째 DateTime의 일부이기 때문입니다! 따라서 최근 DateTime을 ConvertBack 메서드에 제공해야합니다. –

+0

예, 네가 맞습니다. 나는 그 생각을 삭제했다. – bitbonk

+0

네 .. 알 잖아요. MVVM 없이는 어떤 문제를 극복 할 수없는 것처럼 보입니다. –

0

2way 바인딩 및 변환기 매개 변수가있는 변환기를 사용해야합니다. 원본 시간을 변환기에 저장하십시오. 그런 다음 바인딩 원본을 적절히 업데이트 할 수 있습니다.

+0

음 .. 사실이라면, 나는 그 변환기의 예를보고 싶습니다. ConverteBack : 문자열 값만 있습니다 ("16"이라고 가정 해 봅시다), 어떻게 전체 날짜를 얻을 수 있습니까? –

+0

현재 DateTime 값에 대한 액세스가 없으므로 (작동하지 않으므로) 시간/분을 병합 할 수 없으므로 작동하지 않습니다.동일한 인스턴스를 여러 번 사용할 수 있으므로 변환기에 상태를 저장하지 마십시오. – bitbonk

+0

텍스트 상자에 사용자 정의 컨트롤을 생성하고 저장하십시오. – Snake

0

오래된 게시물인데 감사합니다.하지만 오늘이 문제를 발견하고 날짜와 시간을 사용하여 바인딩을 처리하는 다른 방법을 발견했습니다.

날짜에 대해 하나씩, 시간에 대해 하나, 분에 대해 네 가지 속성으로 dateTime이라는 부분 클래스를 만들었습니다. 그런 다음 완성 된 날짜를 반환하는 읽기 전용 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}}"/> 

희망을 사용할 수있는 TextBlock의 말에 정확한 날짜와 시간을 표시합니다.