Xaml 转换器并在日期时间选取器中显示“选择日期”

本文关键字:日期 显示 选择 选择日期 选取 转换器 时间 Xaml | 更新日期: 2023-09-27 18:17:48

在 wpf 应用程序中,我绑定了一些 dateTimePicker。我想创建一个转换器,以便在日期为 31/12/2999 时在 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 时,日期时间选择器中写入的值是"01/01/0001",而不是著名的句子"选择一个日期"。

请问有人有一些想法吗?

多谢

此致敬意

尼克塞斯

Xaml 转换器并在日期时间选取器中显示“选择日期”

代码片段

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

应改为

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

在您的Convert方法中。

在这里,

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

因此,当我们返回 null 日期选择器的 SelectedDate 属性时,它将触发附加的触发器并将文本设置为选择日期。

 <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;

        }
    }

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

这只能在 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 与 12/31/2999(