不要在DependencyProperty中运行PropertyChangedCallback

时间:2011-09-29 09:10:19

标签: wpf

我使用UserControl创建了DependencyProperty。我在UserControl上为此FormLoad设置了一个值。但是当我运行应用程序时,没有显示任何值。

我的代码:

  public static readonly DependencyProperty ValueProperty =
      DependencyProperty.Register("Value", typeof(PersianDateTime), typeof(UCDatePicker),
      new PropertyMetadata(PersianDateTime.Now, new PropertyChangedCallback((onchangedcallback))));

  public PersianDateTime Value
  {
      get { return (PersianDateTime)GetValue(ValueProperty); }
      set { SetValue(ValueProperty, value); }
  }


  private static void onchangedcallback(DependencyObject obj, DependencyPropertyChangedEventArgs e)
  {
      UCDatePicker control = obj as UCDatePicker;
      PersianDateTime newdate = (PersianDateTime)e.NewValue;
      control.Years = ((PersianDateTime)e.NewValue).Year;
      control.Months = ((PersianDateTime)e.NewValue).Month;
      control.Days = ((PersianDateTime)e.NewValue).Day;
      control.Hours = ((PersianDateTime)e.NewValue).Hour;
      control.Minutes = ((PersianDateTime)e.NewValue).Minute;

  }

在我的FormLoad

uCDatePicker1.Value = PersianDateTime.Now;

当我使用断点时,onchangedcallback不会执行。

1 个答案:

答案 0 :(得分:3)

因为你没有改变价值,

在作业之前和之后,价值等于PersianDateTime.Now

只有在为依赖项属性分配不同的值时才会调用

onchangedcallback,如果希望在第一次分配时调用属性更改事件,则可以将依赖项属性的默认值更改为某个默认值

如果PersianDateTime是引用类型(例如类),请更改您的依赖项属性

 ...new PropertyMetadata(null,...

但是看看PersianDateTime类型,似乎是struct,所以你可以使用

 ...new PropertyMetadata(DateTime.MinValue.ToPersianDateTime(),...

它会起作用

希望这有帮助