Привет, у меня есть пользовательский указатель даты, но моя проблема в том, что он не изменится, когда я нажму клавишу 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>