【问题标题】:Xaml Converter and displaying "Select a Date" in the DateTimePickerXaml 转换器并在 DateTimePicker 中显示“选择日期”
【发布时间】:2013-06-06 04:38:19
【问题描述】:

在一个 wpf 应用程序中,我绑定了一些 dateTimePicker。 我想创建一个转换器,以便在日期为 2999 年 12 月 31 日时在 dateTilmePicker 中显示著名的“选择日期”行。

我创建了一个转换器:

    public class DateConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return DateTime.MinValue;

            if (((DateTime)value).ToShortDateString() == "31/12/2999")
                return DateTime.MinValue;

            DateTime returnVal;

            if (DateTime.TryParse(value.ToString(), out returnVal))
            {
                if (returnVal != DateTime.MinValue)
                    return returnVal;
                else
                    return DateTime.MinValue;
            }
            else
                return DateTime.MinValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return DateTime.MinValue;

            DateTime val;
            if (value.ToString() == "31/12/2999")
                return DateTime.MinValue;

            if (DateTime.TryParse(value.ToString(), out val))
                return val;
            else
                return DateTime.MinValue;
        }

    }

这是我的 XAMl:

<DatePicker x:Name="DateTimePicker_Date"  Text="{Binding  RelativeSource={RelativeSource Self}, Converter={StaticResource DateConverter}, Path=SelectedDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, TargetNullValue='', ValidatesOnDataErrors=False}"/>

我的问题是当我的日期是 31/12/2999 时,DateTimePicker 中写入的值是“01/01/0001”,而不是著名的句子“选择日期”。

有人有什么想法吗?

非常感谢,

最好的问候,

尼克斯

【问题讨论】:

    标签: c# .net wpf xaml converter


    【解决方案1】:

    代码sn-p

    if (((DateTime)value).ToShortDateString() == "31/12/2999")
                return DateTime.MinValue;
    

    应该改为

    if (((DateTime)value).ToShortDateString() == "31/12/2999")
                return "select a date";
    

    在您的 Convert 方法中。

    【讨论】:

      【解决方案2】:

      在这里,我更改了转换器以测试所选日期低于或等于今天的日期,然后只返回日期,否则返回 null。

      因此,当我们将 DatePicker 的 SelectedDate 属性返回 null 时,它将触发附加的 Trigger 并将 Text 设置为 Select a Date。

       <DatePicker x:Name="datepicker" Text="{Binding  RelativeSource={RelativeSource Self}, Converter={StaticResource DateConverter}, Path=SelectedDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=False}">
                  <DatePicker.Style>
                      <Style TargetType="DatePicker">
                          <Style.Triggers>
                              <Trigger Property="SelectedDate" Value="{x:Null}">
                                  <Setter Property="Text" Value="Select A Date"/>
                              </Trigger>
                          </Style.Triggers>
                      </Style>
                  </DatePicker.Style>
              </DatePicker>
      
      
      
       public class DateConverter : IValueConverter
          {
              public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
              {
                  if (value == null)
                      return null;
      
                  if (((DateTime)value).ToShortDateString() == "31/12/2999")
                      return null;
      
                  DateTime returnVal;
      
                  if (DateTime.TryParse(value.ToString(), out returnVal))
                  {
      
                      if (returnVal <= DateTime.Today) // to check only
                          return returnVal;
                      //else if (returnVal != DateTime.MinValue)
                      //    return returnVal;
                      else
                          return null;
                  }
                  else
                      return null;
              }
      
              public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
              {
      
      
                  if (value == null)
                      return null;
      
                  DateTime val;
                  if (value.ToString() == "31/12/2999")
                      return null;
      
                  if (DateTime.TryParse(value.ToString(), out val))
                      return val;
                  else
                      return null;
      
      
              }
      
          }
      

      根据您的要求更改转换器代码。

      【讨论】:

        【解决方案3】:

        这只能在 xaml 中完成。无需编写转换器。我什至删除了文本绑定

        <DatePicker x:Name="DateTimePicker_Date">
            <DatePicker.Style>
                <Style TargetType="DatePicker">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=SelectedDate}" Value="31/12/2999">
                            <Setter Property="SelectedDate" Value="{x:Null}" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DatePicker.Style>
        </DatePicker>
        

        附:请确保您的日期格式正确(31/12/2999 vs 12/31/2999)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-06
          相关资源
          最近更新 更多