仅绑定日期和时间

use*_*369 5 c# data-binding wpf datepicker mvvm

我有2个控件:

DatePicker:仅用于日期
文本框与TimeMask:仅用于时间

它们都链接到相同的属性,DateTime EffectiveDate 但是问题是当我更改DatePicker上的Date时,它将TimeTextBox中的Time更改回12:00。

我知道原因,但是有什么最好的解决方案可以让它们分开工作但绑定到同一属性?

我试图采用当前时间并在set属性中建立一个新的Date,但总是以溢出错误告终。

Nko*_*osi 5

您可以使用价值转换器来保持价值

public class DateConverter : IValueConverter
{
    private DateTime timePickerDate;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        timePickerDate = ((DateTime)(value));

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return timePickerDate;

        var datePickerDate = ((DateTime)(value));

        // compare relevant parts manually
        if (datePickerDate.Hour != timePickerDate.Hour
            || datePickerDate.Minute != timePickerDate.Minute
            || datePickerDate.Second != timePickerDate.Second)
        {
            // correct the date picker value
            var result = new DateTime(datePickerDate.Year,
                 datePickerDate.Month,
                 datePickerDate.Day,
                 timePickerDate.Hour,
                 timePickerDate.Minute,
                 timePickerDate.Second);

            // return, because this event handler will be executed a second time
            return result;
        }

        return datePickerDate;
    }
}
Run Code Online (Sandbox Code Playgroud)

并将有问题的两个控件绑定到一个属性,但让日期选择器使用转换器不覆盖时间。

<Grid Margin="10,5" >        
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="auto"/>
    </Grid.ColumnDefinitions>
    <sdk:DatePicker Grid.Column="0" TabIndex="1" Padding="0" SelectedDate="{Binding EffectiveDate, Mode=TwoWay, Converter={StaticResource DateConverter}}" SelectedDateFormat="Short"/>
    <toolkit:TimePicker Grid.Column="1" Value="{Binding EffectiveDate, Mode=TwoWay}" Margin="0" Padding="0" HorizontalAlignment="Left" TabIndex="2" />
</Grid>
Run Code Online (Sandbox Code Playgroud)