пользовательский указатель даты не может получить текст - PullRequest
1 голос
/ 18 августа 2011

Привет, у меня есть пользовательский указатель даты, но моя проблема в том, что он не изменится, когда я нажму клавишу Backspace и сотру дату в текстовом поле. Это все еще возвращает предыдущее значение. Но когда я изменяю его на действительную дату, он работает нормально. Что мне делать с этим, чтобы обнаружить, что есть пустой текст, чтобы я мог проверить его как обязательное поле и не мог быть пустым. Текстовое поле в указателе даты замаскировано.

Я устал выставлять другое свойство как текст, но оно все еще проходит мимо. значение даты. Я попытался получить 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 голосов
/ 23 октября 2011

Некоторый важный код по-прежнему отсутствует - где находится код для commonWPF: maskedTextBox, где находится код для моего: DatePicker?

Чтобы исправить вашу проблему, вы должны пройти по коду с помощьюотладчик и посмотрите, что происходит, когда вы удаляете свой текст.

По сути, я думаю, что если вы удаляете свой текст, вы не (не) устанавливаете свойство, содержащее ваше значение даты (возможно, потому что введенная дата недействительна / пуста, вы устанавливаете ее только в том случае, если она действительна)/ полностью введено).
Поскольку вы не устанавливаете значение на теперь удаленное значение (пустое значение), вы по-прежнему получаете предыдущее значение, сохраненное в свойстве Значение даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...