【问题标题】:Problems setting WPF Datepicker to Null将 WPF Datepicker 设置为 Null 时出现问题
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • TargetNullValue='',让我很开心。谢谢!!
      猜你喜欢
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      相关资源
      最近更新 更多