开发者

Binding Empty Value

开发者 https://www.devze.com 2023-01-24 04:42 出处:网络
Why doesn\'t the PropertyChangedEvent get fired when I have an empty value for a DatePicker in Silverlight?

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;
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消