难倒:我正处于创建月计划程序控件的初始阶段,需要执行一些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绑定,那么它就不会。问题是回电没有解雇,而对于我的生活,我无法理解为什么。
非常感谢任何帮助,特别是指向可能涵盖此问题的文章的链接。
答案 0 :(得分:2)
如果 immediate属性发生更改,则仅触发PropertyChanged回调,这意味着需要替换整个DateTime对象,如果更改了DateTime对象的属性,则不会引发该事件。这就是为什么它适用于像int这样的原始类型。
如果要在DateTime的任何属性发生更改时执行某些方法,则可以实现提供通知的DateTime类。然后,只要任何属性发生变化,您就可以执行该方法。