View Full Version : سوال: DependencyProperty
elec60
یک شنبه 25 آبان 1393, 14:14 عصر
سلام
یه مشکل اساسی پیدا کردم که فقط در مورد DependencyProperty ها وجود داره و نه Property های معمولی!
DependencyProperty ها به صورت public و static داخل کلاس تعریف میشن و یه Property غیر استاتیک به صورت Wrapper عمل میکنه و با متد های GetValue و SetValue مقدار دهی و خواندن مقدار از DependencyProperty رجیستر شده رو انجام میده...
چون DependencyProperty ها به صورت استاتیک هستند پس از طریق نمونه(Instance) به صورت مستقیم قابل دسترسی نیستند اما خاصیت غیراستاتیکی که به صورت Wrapper عمل میکنه به DependencyProperty به شرحی که در بالا گفتم دسترسی داره. پس اگر یه کلاس مثل Button یه خاصیت وابستگی مثل IsDefaultProperty و یه Wrapper مثل IsDefault داشته باشه و دو شی از Button داشته باشیم و اگر خاصیت IsDefault مربوط به اولی رو True کنیم باید این خاصیت در دومی نیز True بشه(که البته منطقی نیست و این طور هم نمیشه) اما چون خاصیت IsDefault نهایتا در DependencyProperty استاتیک IsDefaultProperty ذخیره میشه باید به ازای هر چند تا شی از Button فقط یک و فقط یک مقدار IsDefault داشته باشیم. در واقع باید این مقدار بین همشون share باشه. ولی اینطور نیست
لطفا این موضوع رو مثل من تست کنین.
دلیلشو نفهمیدم!
elec60
سه شنبه 27 آبان 1393, 14:14 عصر
متاسفانه نشد تو این سایت جواب حتی فقط یکی از سوالاتمو بگیرم!
سوال که یکم مفهومی میشه متاسفانه کسی نیست!
پاسخ دادن به اینجور سوالا فقط از آقای وحید نصیری بر میاد که دیگه اینجا نمیان!
sia_2007
پنج شنبه 29 آبان 1393, 21:43 عصر
میشه بر اساس این کد توضیح دهید چرا باید اتفاقی که می گویید رخ دهد ؟
به قسمت های Bold شده دقت کنید
در نهایت مقادیر در Instance ها قرار می گیرند، و Dependency Property ها فقط در خواندن و بالاخص در نوشتن مقادیر به نحوی عمل می کنند که Binding های Xaml سرعت عملکرد خوبی داشته باشند
همین
public class MyStateControl : ButtonBase
{
public MyStateControl() : base() { }
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
"State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}
هر توضیحی لازم هست من در خدمت شما هستم (-:
elec60
پنج شنبه 29 آبان 1393, 22:24 عصر
ممنون بابت جوابتون
مشکل من همچنان حل نشده باقی مونده!
وقتی شما SetValue انجام میدین مقدار value در متغیر استاتیک StateProperty ذخیره میشه که این متغیر بین تمامی نمونه های MyStateProperty باید share باشه ولی نمیشه. سوالم اینه که چرا نمیشه؟
اگه این متغیر از نوع DependencyProperty نباشه و Property استاتیک معمولی باشه در این صورت مثل گفته من عمل میکنه.
SabaSabouhi
شنبه 08 آذر 1393, 12:01 عصر
سلام دوست عزیز
اون DependencyProperty که static هست، برای نگهداری اطلاعات Property شما نیست. و فرمان this.SetValue اگه توجه کنید، با this شروع میشه که محل نگهداری مقدار Property هست.
پس طبیعی هست که مقداری که مثلا به IsDefault یک دکمه اختصاص میدین، به دکمه دیگه ارتباطی نداره.
امیدوارم که پاسخ خودتون رو گرفته باشین.
صبا صبوحی
elec60
شنبه 08 آذر 1393, 21:38 عصر
سلام دوست عزیز
اون DependencyProperty که static هست، برای نگهداری اطلاعات Property شما نیست. و فرمان this.SetValue اگه توجه کنید، با this شروع میشه که محل نگهداری مقدار Property هست.
پس طبیعی هست که مقداری که مثلا به IsDefault یک دکمه اختصاص میدین، به دکمه دیگه ارتباطی نداره.
امیدوارم که پاسخ خودتون رو گرفته باشین.
صبا صبوحی
اینطور که شما گفتین نیست! کلمه this نشون میده که متدهای SetValue و GetValue مربوط به Instance های Button هست اما همین متدهای Instance در نهایت با نوع استاتیک IsDefaultProperty کار میکنن.
جواب هر چیه برمیگرده به DependencyProperty نه چیزی که شما میگین
خیلی راحت میتونین اینو تست کنین: کافیه DependencyProperty رو به Property معمولی تبدیل کنید تا بوضوح ببینید که مقادیر Set شده بین تمامی نمونه ها Share میشن.
پاسخ سوالمو تو StackOverflow پیدا کردم و تا حدودی فهمیدم اما هنوز درک عمیقی پیدا نکردم. اگه بهتر متوجه شدم اینجا هم میزارم
درک عمیق DependencyProperty کار ساده ای نیست و حتی Mathew McDonald هم با اینکه کتابش قویه گفته بحث کامل این نوع پراپرتی ها پیچیده ست و خارج از اسکوپ این کتابه. استفاده از این DP ها ساده ست اما تو پس این ظاهر ساده مفاهیم پیچیده ای وجود داره که تا درک نشن سوال من رو نمیشه جواب داد!
SabaSabouhi
چهارشنبه 12 آذر 1393, 09:06 صبح
با سلام
دوست عزیز، من هم که همین رو گفتم. منظور من از محل نگهداری همان نمونه تولید شده یا instance بود.
صبا صبوحی
elec60
پنج شنبه 13 آذر 1393, 22:54 عصر
محل نگهداری نهایتا متغیر استاتیک IsDefaultProperty هست که باید بین تمامی نمونه ها Share باشه ولی در مورد DependencyProperty ها اینطور نیست و دلیلشو درک نکردم هنوز!
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.