除非焦点更改为另一个控件,否则DatePicker不会更新视图模型

Rob*_*bin 1 wpf datepicker

如何使DatePicker控件更新视图模型而不会失去焦点?

我希望能够运行此示例,键入日期的12/9/11,单击窗口的关闭按钮并调试Debug.Assert.如果我在关闭窗口之前切换到文本框,它可以正常工作.

<Window x:Class="DatePickerTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Closing="MainWindow_OnClosing">
    <StackPanel>
        <DatePicker Name="TheDate" SelectedDate="{Binding Path=SelectedDate}" />
        <TextBox/>
    </StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
using System;
using System.ComponentModel;
using System.Diagnostics;

namespace DatePickerTest
{
   public partial class MainWindow
   {
      public MainWindow()
      {
         InitializeComponent();
         DataContext = new ViewModel();
      }

      private void MainWindow_OnClosing(object sender, CancelEventArgs e)
      {
         var dataContext = DataContext as ViewModel;
         Debug.Assert(dataContext.SelectedDate == new DateTime(2011, 12, 9));
      }
   }

   public class ViewModel
   {
      public DateTime SelectedDate { get; set; }
   }

}
Run Code Online (Sandbox Code Playgroud)

dev*_*tal 11

尝试更改UpdateSourceTriggerPropertyChanged,例如

<DatePicker Name="TheDate" 
            SelectedDate="{Binding Path=SelectedDate
                 , UpdateSourceTrigger=PropertyChanged
                 , Mode=TwoWay}" />
Run Code Online (Sandbox Code Playgroud)

更新

好吧,这好像这是一个已知的问题DatePicker.您可以Text改为绑定到该属性,并设置TargetNullValue:

<DatePicker
   Name="TheDate"
   Text="{Binding Path=SelectedDate
          , Mode=TwoWay
          , UpdateSourceTrigger=PropertyChanged
          , ValidatesOnDataErrors=True
          , TargetNullValue=''}"
/>
Run Code Online (Sandbox Code Playgroud)

  • **[Robin]的评论(http://stackoverflow.com/users/108040/)(拒绝编辑):**有效,谢谢.实际上,在这种情况下所需要的只是:`<DatePicker Name ="TheDate"Text ="{Binding Path = SelectedDate,Mode = TwoWay}"/>` (2认同)