问题:如何将WPF日期选择器设置为null

4
我正在使用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>

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

6

好的,我注意到其他帖子在讨论从后台代码清除控件时如何设置日期选择器的“Text”属性。在一次孤注一掷的尝试中,我尝试了以下方法:

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

使用"SelectedDate"属性的效果并不理想。我将文本替换回"Select a date",并将SelectedDate设置为null。虽然有些违反直觉,但这样做是有效的。


4

TargetNullValue='',让我的一天变得美好。谢谢! - Antonio Rodríguez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接