PDA

View Full Version : اجرا نشدن PropertyChangedCallback در DependencyProperty



niloo17
پنج شنبه 07 مهر 1390, 12:17 عصر
سلام دوستان
من يك usercontrolدارم كه براي يك خاصيت Value دارد . در لود فرم مقدار value را ست مي كنم . ولي در اجرا گاهي اوقات مقدار را نمايش مي دهد و گاهي اوقات نمايش نمي دهد .
اين usercontrol


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;

}

و در لود برنامه


uCDatePicker1.Value = PersianDateTime.Now;


وقتي از breakpoint استفاده مي كنم . در بعضي اجراها متد onchangedcallback اجرا مي شود و گاهي اوقات اجرا نمي شود .
ممنون مي شم از راهنماييتون

A.Karimi
جمعه 08 مهر 1390, 12:31 عصر
شما مقدار PersianDateTime.Now را به عنوان مقدار پیشفرض این DP قرار دادید و مجددا مقدار PerisanDateTime.Now را مقدار دهی می‌کنید (و ظاهراً چون فاصله زمانی خیلی کم است هر دو مقدار با هم برابر هستند). تا وقتی که مقدار یک DP تغییر نکند رویداد Change اتفاق نخواهد افتاد. شما باید کد تعریف DP را به شکل زیر تغییر دهید:



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


البته مقدار null که به عنوان مقدار پیشفرض معرفی شده ممکن است PersianDateTime شما از نوع ValueType باشد و null نگیرد در این صورت یک مقدار دیگر در نظر بگیرید که با مقدار PersianDateTime.Now برابر نباشد.

niloo17
شنبه 09 مهر 1390, 07:58 صبح
ممنون از راهنماييتون
persiandatetime مقدار null قبول نمي كند . ولي متوجه مشكل شدم . بازم ممنون