Привязка пустого значения - PullRequest
0 голосов
/ 10 ноября 2010

Почему PropertyChangedEvent не запускается, когда у меня есть пустое значение для DatePicker в Silverlight?

Вот мой пример 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>

Код сзади:

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

Код моей модели (как видите, я пробовал Nullable<DateTime> и 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 PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2010

Проблема, с которой я столкнулся, заключалась в том, что ConvertBack выдавал исключение, поэтому PropertyChanged никогда не запускали.

Я также изменил элемент управления Дата для привязки к SelectedDate вместо Text, как Mark Heath предлагается.

Обновлен Xaml

<controls:DatePicker Height="20" Width="100"  x:Name="DatePicker" SelectedDate="{Binding Path=DOB, Mode=TwoWay, Converter={StaticResource DateConverter}}"/>

Вот мой конвертер ...

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 голосов
/ 10 ноября 2010

если вы не привязываете к SelectedDate свойству DatePicker вместо Text?

...