将WPF日期选择器的默认日期设置为当前日期

12

我有一个 WPF 数据表格,其中一个列是日期列。

因此,我使用了以下的 DataTemplateColumn

<my:DataGridTemplateColumn
    CellTemplate="{StaticResource EffDateDateTimePickerControl}"
    CellEditingTemplate="{StaticResource addrEffDate}"
    Header="Effective Date"/>

在我的资源文件中,我编写了以下代码:

<Style TargetType="{x:Type my:Calendar}" x:Key="CalenderControlTemplate">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="my:Calendar" >
                <my:CalendarItem Name="myCalendarItem" 
                                 Background="White" 
                                 BorderBrush="Black"
                                 BorderThickness="1"
                                 VerticalAlignment="Center" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style> 

<DataTemplate x:Key="EffDateDateTimePickerControl">
    <Label x:Name="lblEffDate" Content="{Binding effectiveDate,Mode=TwoWay}" ></Label>
</DataTemplate>

<DataTemplate x:Key="addrEffDate">
    <my:DatePicker x:Name="dpEffDate" Text="{Binding Path=effectiveDate,Mode=TwoWay}"
                   SelectedDate="{Binding Now}" DisplayDateStart="{Binding Now}"
                   CalendarStyle="{DynamicResource CalenderControlTemplate}" />
</DataTemplate>

当我点击日期选择控件时,它默认的日期是1/1/0001?

如何将我的日期选择器设置为当前日期。

3个回答

19

除非你的DataContext中有一个名为Now的属性,否则你的Bindings将会失败。相反,你应该使用{x:Static}语法,如下所示:

<DataTemplate x:Key="addrEffDate">
    <my:DatePicker x:Name="dpEffDate" Text="{Binding Path=effectiveDate,Mode=TwoWay}"
                   SelectedDate="{x:Static sys:DateTime.Now}" DisplayDateStart="{x:Static sys:DateTime.Now}"
                   CalendarStyle="{DynamicResource CalenderControlTemplate}" />
</DataTemplate>

由于 DateTime 不在标准的 XAML 命名空间中,因此您需要向根元素添加 xmlns 声明:

<UserControl xmlns:sys="clr-namespace:System;assembly=mscorlib" ...

这应该可以工作,但如果不行,你可以尝试做 {Binding Source={x:Static sys:DateTime.Now}, Mode=OneTime}。 - Abe Heidebrecht
我需要将其绑定到我的类。这是一个新行中的新对象,那么它该如何工作? - Dani
1
你可以直接绑定到你的类属性。如果它是DataGrid中的新行,那么你的类可能还没有被创建,所以在这种情况下,你可能需要为绑定提供一个FallbackValue,它可以是静态的DateTime.Today。 - Abe Heidebrecht

1

我认为你需要替换

DisplayDateStart

使用

DisplayDate

因为DisplayDateStart:(来自MSDN)

获取或设置要显示的第一个日期。

而不是要显示的日期。


0

除了Abe Heidebrecht的答案之外,我提供一个例子。我认为Abe的答案是正确的。我曾经遇到过新对象和类绑定的问题,并通过以下方式解决了这个问题:

 get
 {
  return (ClassDate - DateTime.MinValue).TotalDays == 0 ? DateTime.Now :ClassDate;
 }

干杯 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接