自定义datepicker无法获取文本

时间:2011-08-18 04:16:23

标签: c# wpf xaml text datepicker

您好我有一个自定义日期选择器但我的问题是当我按下退格键并删除文本框中的日期时它不会更改。它仍然返回prev值。但是当我将其更改为有效日期时,它可以正常工作。我该怎么做才能检测到有一个空文本,以便我可以将其验证为必填字段,不能为空。 datepicker中的文本框是蒙版的。

我厌倦了将另一个属性作为文本,但它仍然通过了prev。日期值。我尝试获取dtValue而传递“__ / _ / __ ”,这影响了我的绑定。有什么建议吗?感谢。

public partial class MaskedDatePicker : UserControl
{
    public MaskedDatePicker()
    {
        InitializeComponent();
    }

    private void datePicker1_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        dtValue.Focus();
    }

    private void datePicker1_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
    {
        if (dtPicker.SelectedDate.HasValue)
        {
            dtValue.Text = dtPicker.SelectedDate.Value.ToString("MM/dd/yyyy");
            dtValue.EnteredDate = dtPicker.SelectedDate.Value;
        }
        else
        {
            dtValue.Text = DateTime.Today.ToString("MM/dd/yyyy");
            dtValue.EnteredDate = DateTime.Today;
        }
    }

    public static DependencyProperty DateValueProperty =
        DependencyProperty.Register("DateValue", typeof(DateTime), typeof(MaskedDatePicker));

    public DateTime? DateValue
    {
        get { return (DateTime?)GetValue(DateValueProperty); }
        set
        {
            SetValue(DateValueProperty, value);
        }
    }

    private void dtPicker_CalendarOpened(object sender, RoutedEventArgs e)
    {
        DateTime dt;
        if (DateTime.TryParse(dtValue.Text, out dt))
        {
            dtValue.EnteredDate = dt;
            dtPicker.SelectedDate = dt;
        }
        else
        {
            dtPicker.SelectedDate = DateTime.Now.Date;
            dtValue.EnteredDate = DateTime.Now.Date;
        }
    }

    public bool HasValue
    {
        get
        {
            DateTime result;

            if (DateTime.TryParse(dtValue.Text, out result))
            {
                return true;
            }
            return false;
        }
    }

    public new void Focus()
    {
        dtValue.Focus();
    }

    private void dtPicker_CalendarClosed(object sender, RoutedEventArgs e)
    {
        dtValue.Focus();
    }
}

这是xaml:

<UserControl.Resources>
    <ResourceDictionary>
        <converters:DateConverter x:Key="DateConverter" />
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="..\ResourceDictionary\ResourceWPF.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

<Border BorderThickness="0" BorderBrush="#FF7F9DB9" >
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Left">
        <commonWPF:MaskedTextBox HorizontalAlignment="Left" Margin="0,2" Style="{StaticResource MaskedDateStyle}"
                            Mask="00/00/0000" x:Name="dtValue" BorderThickness="1" 
                            Text="{Binding ElementName=usrMaskedDatePicker, Path=DateValue, Converter={StaticResource DateConverter}}"
                            Width="70" Height="Auto"/>
        <my:DatePicker HorizontalAlignment="Right"
                       Height="Auto" x:Name="dtPicker"
                       Width="26" BorderThickness="0" PreviewGotKeyboardFocus="datePicker1_PreviewGotKeyboardFocus" 
                       SelectedDateChanged="datePicker1_SelectedDateChanged" 
                       SelectedDate="{Binding ElementName=usrMaskedDatePicker, Path=DateValue}" CalendarOpened="dtPicker_CalendarOpened" IsTabStop="False" IsDropDownOpen="False" 
                       CalendarClosed="dtPicker_CalendarClosed"
                       KeyboardNavigation.TabNavigation="None" >
        </my:DatePicker>
    </StackPanel>
</Border>

1 个答案:

答案 0 :(得分:0)

一些关键代码仍然缺失 - commonWPF:maskedTextBox的代码在哪里,我的代码是:DatePicker?

为了解决您的问题,您必须使用调试器逐步执行代码,并查看删除文本时发生的情况。

基本上,我认为如果你删除你的文本,你不是(重新)设置保存你的日期值的属性(可能是因为输入的日期无效/是空的,你只能设置它是否有效/完全输入)。
因为您没有将值设置为现在删除的值(空值),所以仍然可以获得存储在Date值属性中的先前值。