PropertyChangeCallBack не запускает DependencyProperty в UserControl - PullRequest
2 голосов
/ 21 мая 2011

Stumped: я нахожусь на начальных этапах создания элемента управления планировщика месяца, который должен выполнить некоторое действие пользовательского интерфейса. I Элемент управления при предоставлении даты из привязки ViewModel в XAML. Когда я запускаю код, ViewModel возвращает значение, но PropertyChangeCallBack не запускается. Я сделал то же самое в public class ExtendedDataGrid : DataGrid элементе управления, и это прекрасно работает, но похоже, что вы должны сделать что-то другое с UserControls. Вот основа моего кода:

public partial class DiaryMonthViewUserControl : UserControl
{
    private DateTime _topDate;


    public DiaryMonthViewUserControl()
    {
        InitializeComponent();
    }

    // Property to get the date from the ViewModel for processing. This will fire and event to set the month we want to display
    public static readonly DependencyProperty TheDateProperty = DependencyProperty.Register("TheDate", typeof(DateTime),
                      typeof(DiaryMonthViewUserControl),
                      new FrameworkPropertyMetadata(DateTime.Today, OnDatePropertyChanged, null));

    public void SetTheCurrentDate(DateTime CurrentDate)
    {
        _topDate = CurrentDate;

        // Like Outlook, whatever date we supply, I want the first top level displayed date for the month
        if (_topDate.Day > 1)
            _topDate = _topDate.AddDays(-(_topDate.Day-1)); // First day of the month

        // Get to the first Monday before the 1st of the month if not on a Monday
        while (_topDate.DayOfWeek != DayOfWeek.Monday)
            _topDate = _topDate.AddDays(-1);

        // I will set the UI here once I have solved this problem.
        MakeChangesToTheUIPlease();
    }

    private static void OnDatePropertyChanged(DependencyObject Source, DependencyPropertyChangedEventArgs e)
    {
        var control = Source as DiaryMonthViewUserControl;

        if (control != null)
            control.SetTheCurrentDate((DateTime)e.NewValue);
    }

    [Bindable(true)]
    public DateTime TheDate
    {
        get { return (DateTime)GetValue(TheDateProperty); }
        set { SetValue(TheDateProperty, value); }
    }
}

Я также пытался использовать new PropertyChangedCallback(OnDatePropertyChanged) в качестве параметра, и он все еще не работает.

Моя привязка выглядит следующим образом:

<my:DiaryMonthViewUserControl HorizontalAlignment="Left" Margin="12,12,0,0" x:Name="diaryMonthViewUserControl1" 
                              VerticalAlignment="Top" Height="325" Width="476" TheDate="{Binding Path=CurrentDate}" />

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

Буду признателен за любую помощь, особенно ссылки на статьи, которые могут освещать эту проблему.

1 Ответ

2 голосов
/ 21 мая 2011

Обратный вызов PropertyChanged срабатывает только при изменении немедленного свойства , что означает необходимость замены всего объекта DateTime; если свойства объекта DateTime будут изменены, событие не будет вызвано.Вот почему он работает для примитивных типов, таких как int.

Если вы хотите выполнять какой-либо метод всякий раз, когда изменяется любое свойство DateTime, вы можете реализовать класс DateTime, который предоставляет уведомления.Затем вы можете выполнить метод всякий раз, когда изменяется любое из свойств.

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