将WPF Datepicker设置为Null时出现问题

时间:2014-04-16 23:21:32

标签: wpf

我正在使用WPF和MVVM。我的模型中有一个属性是可以为空的Datetime(Datime?)。

我的Xaml看起来像:

<CheckBox Grid.Row="0" Grid.Column="2" x:Name="ChkBoxFromDate"
          Margin="10,0,0,5" FontWeight="Bold">
    Orders with Trades After Date:
</CheckBox>
<DatePicker Grid.Row="1" Grid.Column="2" Margin="10,0,0,0"
            SelectedDate="{Binding FromDate}" HorizontalContentAlignment="Stretch">
    <DatePicker.Style>
        <Style TargetType="{x:Type DatePicker}">
            <Setter Property="SelectedDate" Value="{Binding Path=FromDate, Mode=TwoWay}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=ChkBoxFromDate, Path=IsChecked}" Value="false">
                    <Setter Property="SelectedDate" Value="{x:Null}" />
                    <Setter Property="IsEnabled" Value="false" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DatePicker.Style>
</DatePicker>

我在文本框和cobmobox上有相同的禁用和清除通过复选框的模式,它工作得很好。使用Datepicker,selectdate的Null设置不起作用。 UI和模型都不会更新。 IsEnabled被设置并且控件变灰,但是datepicker中的值仍然存在。我错过了什么?

更新

显然,这是一个比我最初想象的更深层次的问题。我认为在文本框和组合框上工作的事实并非如此(UI只是让它看起来那样)。上面的代码会发生什么,实际上是通过将绑定设置为Null来清除绑定。我希望它能设置绑定的值,但事实并非如此。当您使用setter时,实际上是清除绑定并将属性设置为null,这就是模型未更新的原因。那么为什么下面的代码可以工作呢?为什么文本框和组合框出现了?#39;清除自己和datepicker没有。据我所知,datepicker&#39; textbox&#39;没有直接连接到SelectedDate属性。这就是它如何显示&#34;选择日期&#34;当它为空或空时,否则显示日期。换句话说,在设置SelectedDate和在文本框中显示文本之间会发生一些神奇的事情。这就是“hack&#39;在下面的xaml中工作。通过设置文本(而不是SelectedDate),我没有清除SelectedDate上的绑定,而是使用Control执行的魔术来将Text属性与SelectedDate属性同步。你可以为Combobox做同样的技巧。但是对于文本框,要绑定的属性是文本属性,似乎没有办法解决这个问题。我对这个控件的解决方法最终是向复选框添加一个命令,该命令将Textbox绑定值设置为从Model结束的东西为null并绑定到IsChecked属性。如果有人有任何更好的想法,请在下面发布。

2 个答案:

答案 0 :(得分:4)

好的,所以我注意到在谈论从代码隐藏中清除控件时,其他一些帖子正在讨论设置日期选择器的“文本”。在Hail Mary的尝试中,我试过了:

<Setter Property="Text" Value="{x:Null}" />

而不是“SelectedDate”属性,它按预期工作。我将文本替换回“选择日期”并将SelectedDate设置为null。违反直觉,但它确实有效。

答案 1 :(得分:1)

在此处查看解决方案:Binding a nullable datetime within WPF application

<DatePicker Text={Binding dpc_date_engagement, Mode=TwoWay, TargetNullValue='', UpdateSourceTrigger=PropertyChanged} />