我正在使用WPF和MVVM。我的模型中有一个可空的Datetime属性(Datime?)。
我的Xaml代码如下:
我在文本框和下拉框上使用复选框禁用和清除相同的模式,它可以正常工作。但是在日期选择器上,设置所选日期的Null值无效。UI和模型都没有更新。虽然IsEnabled被设置并且控件变灰,但是日期选择器中的值仍然存在。我错过了什么吗?
更新:
所以显然这是一个比我最初想象的更深层次的问题。我认为在文本框和下拉框上工作的东西实际上并没有起作用(只有UI看起来是这样)。上面的代码会清除绑定,将其设置为Null。我希望它能够设置绑定的值,但事实并非如此。当您使用setter时,实际上正在清除绑定并将属性设置为null,这就是为什么模型没有得到更新的原因。那么为什么下面的代码可以工作,而文本框和下拉框“似乎”可以清除自己,而日期选择器却不行呢?据我所知,日期选择器的“文本框”与SelectedDate属性没有直接关联。这就是它可以在为空或为null时显示“选择日期”,否则显示日期的原因。换句话说,在设置SelectedDate并在文本框中显示文本之间发生了一些魔法。这就是允许下面的XAML“hack”工作的原因。通过设置文本(而不是SelectedDate),我没有清除SelectedDate上的绑定,而是运用了控件同步Text属性和SelectedDate属性的魔法。您可以对ComboBox使用相同的技巧。然而对于TextBox来说,您想要绑定的属性就是Text属性,似乎没有办法绕过这一点。我的解决方法是为复选框添加一个命令,从模型端将文本框绑定值设置为null,并绑定到IsChecked属性。如果有更好的想法,请在下面发表。
我的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>
我在文本框和下拉框上使用复选框禁用和清除相同的模式,它可以正常工作。但是在日期选择器上,设置所选日期的Null值无效。UI和模型都没有更新。虽然IsEnabled被设置并且控件变灰,但是日期选择器中的值仍然存在。我错过了什么吗?
更新:
所以显然这是一个比我最初想象的更深层次的问题。我认为在文本框和下拉框上工作的东西实际上并没有起作用(只有UI看起来是这样)。上面的代码会清除绑定,将其设置为Null。我希望它能够设置绑定的值,但事实并非如此。当您使用setter时,实际上正在清除绑定并将属性设置为null,这就是为什么模型没有得到更新的原因。那么为什么下面的代码可以工作,而文本框和下拉框“似乎”可以清除自己,而日期选择器却不行呢?据我所知,日期选择器的“文本框”与SelectedDate属性没有直接关联。这就是它可以在为空或为null时显示“选择日期”,否则显示日期的原因。换句话说,在设置SelectedDate并在文本框中显示文本之间发生了一些魔法。这就是允许下面的XAML“hack”工作的原因。通过设置文本(而不是SelectedDate),我没有清除SelectedDate上的绑定,而是运用了控件同步Text属性和SelectedDate属性的魔法。您可以对ComboBox使用相同的技巧。然而对于TextBox来说,您想要绑定的属性就是Text属性,似乎没有办法绕过这一点。我的解决方法是为复选框添加一个命令,从模型端将文本框绑定值设置为null,并绑定到IsChecked属性。如果有更好的想法,请在下面发表。