Why doesn't the PropertyChangedEvent get fired when I have an empty value for a DatePicker
in Silverlight?
Here's my example XAML
<UserControl x:Class="ValidationExamples.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ig="http://schemas.infragistics.com/xaml"
xmlns:controls='clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls'
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel>
<controls:DatePicker Height="20" Width="100" x:Name="DatePicker" SelectedDate="{Binding Path=DOB, Mode=TwoWay}"/>
<Button Height="20" Width="100" Click="Button_Click" Content="Break"/>
</StackPanel>
</Grid>
</UserControl>
Code Behind:
public partial class MainPage : UserControl
{
private Model MyModel;
public MainPage()
{
InitializeComponent();
this.MyModel = new Model();
this.MyModel.DOB = DateTime.Now;
this.DataContext = this.MyModel;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// Empty on purpose
}
}
My Model Code (As you can see I tried Nullable<DateTime>
and DateTime
):
public class Model : INotifyPropertyChanged
{
private Nullable<DateTime> dob;
public Nullable<DateTime> DOB
{
get
{
return this.dob;
}
set
{
this.dob = value;
NotifyPropertyChanged("DOB");
}
}
//private DateTime dob;
//public DateTime DOB
//{
// get
// {
// return this.dob;
// }
// set
// {
// this.dob = value;
// NotifyPropertyChanged("DOB");
// }
//}
public event Property开发者_开发技巧ChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
shouldn't you be binding to the SelectedDate
property of the DatePicker
instead of Text
?
The problem I was facing was the fact that ConvertBack
was throwing an exception this is why PropertyChanged
was never fired.
I also changed the Date control to bind to SelectedDate
rather than Text
as Mark Heath suggested.
Updated Xaml
<controls:DatePicker Height="20" Width="100" x:Name="DatePicker" SelectedDate="{Binding Path=DOB, Mode=TwoWay, Converter={StaticResource DateConverter}}"/>
Here's my Converter...
public class DateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime? result = null;
DateTime result2;
if (value != null)
{
if (!String.IsNullOrEmpty(value.ToString()))
{
if (DateTime.TryParse(value.ToString(), out result2))
{
return result2;
}
}
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime? result = null;
DateTime result2;
if (value != null)
{
if (!String.IsNullOrEmpty(value.ToString()))
{
if (DateTime.TryParse(value.ToString(), out result2))
{
return result2;
}
}
}
return result;
}
}
精彩评论