【发布时间】:2014-06-01 01:31:06
【问题描述】:
我正在使用 WPF 和 MVVM。我的模型中有一个可以为空的日期时间(日期时间?)的属性。
我的 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,对于 selecteddate 的 Null 设置不起作用。 UI 和模型都不会更新。 IsEnabled 被设置并且控件变灰,但日期选择器中的值仍然存在。我错过了什么?
更新
显然,这是一个比我最初想象的更深层次的问题。我认为在文本框和组合框上工作的东西实际上是不工作的(用户界面只是让它看起来那样)。上面代码发生的情况是,您实际上是通过将绑定设置为 Null 来清除绑定。我希望它会设置绑定的值,但事实并非如此。当您使用 setter 时,您实际上是在清除绑定并将属性设置为 null,这就是模型没有更新的原因。那么为什么下面的代码有效,为什么文本框和组合框“出现”清除自己而日期选择器没有。据我所知,日期选择器“文本框”没有直接连接到 SelectedDate 属性。这就是当它为空或为空时它可以显示“选择日期”并在其他情况下显示日期的方式。换句话说,在设置 SelectedDate 和在文本框中显示文本之间发生了一些神奇的事情。这就是允许“hack”在下面的 xaml 中工作的原因。通过设置文本(而不是 SelectedDate),我并没有清除 SelectedDate 上的绑定,而是使用了 Control 使 Text 属性与 SelectedDate 属性同步的魔法。您可以对 Combobox 执行相同的技巧。但是,对于文本框,您要绑定的属性是文本属性,似乎没有办法解决这个问题。我为这个控件所做的工作最终是向复选框添加了一个命令,该命令将文本框绑定值从模型端设置为 null,并绑定到 IsChecked 属性。如果有人有更好的想法,请在下方留言。
【问题讨论】:
标签: wpf