2

C# 4.0 (WPF) アプリケーションに日付ピッカーがあり、テキスト ボックスに表示される日付の形式を yyyy/MM/dd に変更したいと考えています。これで、dd/MM/yyyy という形式が表示されます。

私のdatePickerのaxmlには、次のコードがあります。

<DatePicker Height="25" HorizontalAlignment="Left" Margin="5,36,0,0" Name="dtpStartDate"
                    SelectedDate="{Binding StartDateSelectedDate}" VerticalAlignment="Top" Width="115">
            <DatePicker.Resources>
                <Style TargetType="{x:Type DatePickerTextBox}">
                    <Setter Property="Control.Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <TextBox x:Name="PART_TextBox" 
                                    Text="{Binding Path=SelectedDate, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}, StringFormat={}{0:yyyy/MM/dd}}" />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DatePicker.Resources>
        </DatePicker>

これは初めてすべてが正常に機能するようで、希望する形式で日付を表示でき、手動またはカレンダーを使用して日付を変更できます。どちらの方法でも、viewModel に到着する日付は正しいです。

しかし、ビューモデルでこのケースを制御すると、日付が空の場合にそれを検出したいので、問題があります。しかし、日付ピッカーをクリアすると、ビューモデルで最後の正しい日付が到着するため、日付が空かどうかを確認できません。

では、日付ピッカーで日付の形式を変更し、日付が空/nullかどうかを制御するにはどうすればよいですか?

ありがとう。ダイムロック。

4

2 に答える 2

5

次の解決策を試すことができます。

まず、次のコンバーターを作成します。

public class StringToDateTimeConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return null;
        }
        return ((DateTime)value).ToString(parameter as string, CultureInfo.InvariantCulture);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (string.IsNullOrEmpty(value as string))
        {
            return null;
        }
        try
        {
            DateTime dt = DateTime.ParseExact(value as string, parameter as string, CultureInfo.InvariantCulture);
            return dt as DateTime?;
        }
        catch (Exception)
        {
            return null;
        }
    }
}

次に、xaml で、コンバーターのインスタンスを作成し、それを DatePicker のテキスト ボックスで使用する必要があります。

<Window x:Class="TestDatePicker.MainWindow"
    ... 
    xmlns:converters="clr-namespace:TestDatePicker"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    ...
    <converters:StringToDateTimeConverter x:Key="StringToDateTimeConverter" />
</Window.Resources>
<Grid DataContext="{StaticResource MainWindowVM}">
    ...
    <DatePicker Height="25" HorizontalAlignment="Left" Margin="5,36,0,0" Name="dtpStartDate"
                SelectedDate="{Binding StartDateSelectedDate}" VerticalAlignment="Top" Width="115">
        <DatePicker.Resources>
            <Style TargetType="{x:Type DatePickerTextBox}">
                <Setter Property="Control.Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <TextBox x:Name="PART_TextBox" 
                                Text="{Binding Path=SelectedDate, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}, Converter={StaticResource StringToDateTimeConverter}, ConverterParameter=yyyy/MM/dd}" />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DatePicker.Resources>
    </DatePicker>
    ...
</Grid>

最後に、viewmodel では、プロパティは DateTime? タイプである必要があります。(つまり、null 許容の DateTime)。

    private DateTime? _startDateSelectedDate;
    public DateTime? StartDateSelectedDate
    {
        get { return _startDateSelectedDate; }
        set
        {
            if (_startDateSelectedDate != value)
            {
                _startDateSelectedDate = value;
                RaisePropertyChanged(() => this.StartDateSelectedDate);
            }
        }
    }

これがお役に立てば幸いです

よろしく

クロード

于 2013-01-31T22:58:23.640 に答える
2

デフォルトでは、DateTimerPicker は null 値をサポートしていません。

同じトピックの MSDN からのこの投稿が役立つかもしれません。

そこには、それを実装する方法や、null 可能な日時ピッカーのコード プロジェクトの他のアイデアがあります。

于 2013-01-31T16:49:14.507 に答える