2010-05-21 725 views
0

我有3个文本框到编辑日期时间。 需要注意的是,这2个文本框正在编辑第一个TextBox DateTime值的小时和分钟。 一个编辑日期和2个编辑小时和分钟。 你会怎么做?下面的代码编辑小时或分钟时,并不反映日期时间的变化,因为它的ToString(“HH”)和日期时间值丢失:WPF编辑日期时间的小时和分钟

<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我会以编程方式解决它。 但我只想知道是否有任何可能性直接在XAML中

回答

1

只用XAML并不容易。有几种可能性,怎么解决这个问题:

1.有一个属性DateTime Value写自定义控件或用户控件可以做到这一点

你可以WIRTE一个自定义的控制/用户控制(例如DateTimeTextBox),其你的xaml可以绑定并且包含逻辑来转换为在其两个文本框之一中输入的日期时间值。而不是两个文本框,你也可以有像maskedtextbox这样的东西。

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

您的视图模型将然后合并:在视图模型

如果你有MVVM去,你可以给你的视图模型两个专用的性能int DateTimeHoursint DateTimeMinutes和绑定针对

2.两个专用的属性这两个属性为单个DateTime值。

+0

让我们来谈谈3:那么问题是我无法将它与实际的DateTime合并,因为这些小时和分钟是第一个DateTime的一部分!所以我需要将最近的DateTime提供给ConvertBack方法。 – 2010-05-21 08:20:29

+0

是的,你是对的,这是不容易的。我删除了这个想法 – bitbonk 2010-05-21 08:22:10

+0

是的..你知道..在我看来,如果没有MVVM就无法克服一些问题。 – 2010-05-21 08:43:39

0

您将需要使用具有2way绑定和转换器参数的转换器。将最初的小时保存在Converter中。然后,您可以适当地更新绑定源。

+0

好吧..如果是真的,我希望看到该转换器的一个例子。 ConverteBack:你只有一个字符串值(比如说“16”),你将如何从它得到整个Date? – 2010-05-21 08:17:35

+0

这不会起作用,因为您没有任何对当前DateTime值的访问权限(整体),因此您无法将小时/分钟与它合并。您也不会在转换器中保存任何状态,因为可以多次使用相同的实例。 – bitbonk 2010-05-21 08:24:13

+0

使用其中的文本框创建一个用户控件并保存它? – Snake 2010-05-21 08:32:43

0

我很欣赏这是一个旧帖子,但今天我发现了这个,并找到了另一种处理日期和时间绑定的方法。

我创建了一个名为dateTime的部分类,其中4个属性为日期,1个为小时,另一个为分钟。然后返回一个完成日期的只读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}}"/> 

希望这可以帮助其他人了。

相关问题