0

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 の場合、DateTimePicker に書き込まれた値が、「日付を選択してください」という有名な文の代わりに「01/01/0001」になっていることです。

アイデアはありますか?

どうもありがとう、

よろしくお願いします、

ニクセウス

4

3 に答える 3

0

コードスニペット

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

に変更する必要があります

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

あなたのConvert方法で。

于 2013-06-10T14:14:59.067 に答える
0

ここでは、選択した日付が今日の日付以下であるかテストするためにコンバーターを変更し、日付を返すか、それ以外の場合は null を返します。

そのため、DatePicker の SelectedDate プロパティに null を返すと、添付されたトリガーがトリガーされ、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;


        }

    }

必要に応じてコンバータ コードを変更します。

于 2013-06-10T14:26:18.787 に答える
0

これは xaml でのみ実行できます。コンバーターを書く必要はありません。Textバインディングも削除しました

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

PS 日付形式が正しいことを確認してください (31/12/2999 対 12/31/2999)

于 2013-06-10T17:01:52.487 に答える