从另一个DatePicker值绑定DisplayDate和DisplayDateStart

时间:2017-05-18 15:38:39

标签: wpf

我有两个日期选择器。第一个datepicker设置第二个DisplayDate和DisplayDateStart。下面的代码设置DisplayDate和DisplayDateStart是正确的,我的问题是,当我选择第二个datepicker的日期时,它还会更新第一个datepicker选择日期。我可以问一下如何解决这个问题?

例如

DP1.SelectedDate = january 1 2017

如果我将DP2.SelectedDate更改为2017年2月3日,DP1.SelectedDate也会更改为。

<telerik:RadDatePicker SelectedDate="{Binding DisbursalDatePicker, Mode=TwoWay}"/>

<telerik:RadDatePicker  DisplayDateStart="{Binding DisbursalDatePicker, Mode=TwoWay}"
             DisplayDate="{Binding DisbursalDatePicker, Mode=TwoWay}"/>

我也尝试将DisplayDateStart和DisplayDate设置为OneWay但是DisplayDate无法正常工作,它显示DateTime.Now而不是显示DisbursalDatePicker。

我试图让帖子尽可能简单,所以任何人都可以测试它,但我相信这可能是Telerik控件的问题。只有telerik:RadDatePicker而不是wpf DatePicker

才会出现此问题

1 个答案:

答案 0 :(得分:0)

<Mode=TwoWay上{p> DatePicker.SelectedDate是多余的;在创建依赖项属性时,框架使该属性成为绑定的默认值。

DatePicker.DisplayDate似乎不太好:我通过实验找到的是,如果SelectedDate为空,DisplayDate将是最初突出显示的日期。日历弹出窗口。我可以看到它有用,但它并不是你想要的。 MSDN doesn't even admit to having a guess。 MSDN的WPF文档令人失望。

如果我理解你的要求,这是有效的:

<DatePicker 
    SelectedDate="{Binding DisbursalDatePicker}"/>

<DatePicker 
    DisplayDateStart="{Binding DisbursalDatePicker}" 
    SelectedDate="{Binding DisbursalDatePicker, Mode=OneWay}" 
    />

当我更改第一个日期选择器时,它会在第二个日期选择器上更新DisplayDateStart。第二次更新以在DisbursalDatePicker更改时显示DisbursalDatePicker,但在与其互动时不会更新DisbursalDatePicker

我不确定它有什么好处,因为视图模型无法从第二个DatePicker中获取值。如果是我,我有两个viewmodel属性:DisbursalDatePickerOtherDateValue。当DisbursalDatePicker更改时,OtherDateValue的设置者会更新DisbursalDatePicker,但反之亦然。

<DatePicker 
    SelectedDate="{Binding DisbursalDatePicker}"/>

<DatePicker 
    DisplayDateStart="{Binding DisbursalDatePicker}" 
    SelectedDate="{Binding OtherDateValue}" 
    />

我可能会使DisbursalDatePicker设置器变得更聪明:仅当OtherDateValue的值变为无效时才更新OtherDateValue

private DateTime _disbursalDatePicker = default(DateTime);
public DateTime DisbursalDatePicker
{
    get { return _disbursalDatePicker; }
    set
    {
        if (value != _disbursalDatePicker)
        {
            _disbursalDatePicker = value;
            if (OtherDateValue.CompareTo(DisbursalDatePicker) < 0)
            {
                OtherDateValue = DisbursalDatePicker;
            }
            OnPropertyChanged();
        }
    }
}