PropertyChangeCallBack不在UserControl中的DependencyProperty上触发

时间:2011-05-21 07:48:24

标签: wpf xaml dependency-properties

难倒:我正处于创建月计划程序控件的初始阶段,需要执行一些UI操作我是从XAML中绑定的ViewModel提供日期时的控件。当我运行代码时,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的getter上中断,如果我删除了CurrentDate绑定,那么它就不会。问题是回电没有解雇,而对于我的生活,我无法理解为什么。

非常感谢任何帮助,特别是指向可能涵盖此问题的文章的链接。

1 个答案:

答案 0 :(得分:2)

如果 immediate属性发生更改,则仅触发PropertyChanged回调,这意味着需要替换整个DateTime对象,如果更改了DateTime对象的属性,则不会引发该事件。这就是为什么它适用于像int这样的原始类型。

如果要在DateTime的任何属性发生更改时执行某些方法,则可以实现提供通知的DateTime类。然后,只要任何属性发生变化,您就可以执行该方法。