تمام سوالات سوالات بدون پاسخ سوال بپرسید

من زمان زیادی را برای یافتن علت استفاده از Dependency Property ها صرف کرده ام. چرا “text” در یک System.Controls.TextBox باید یک Dependency Property باشد نه یک ویژگی معمولی؟ تعریف یک ویژگی از نوعDependency Property چه مزایایی را در بر دارد؟
کاری را که سعی دارم انجام بدهم این است که یک ویژگی ValidationRules را به UserControl خود اضافه کنم که شامل validation rule های دیگری نیز خواهد بود.

<customControls:RequiredTextBox.ValidationRules>
                        <validators:NotNullOrEmptyValidationRule ErrorMessage="FirstName cannot be null or empty"/>
                    </customControls:RequiredTextBox.ValidationRules>

مشکل این جاست که نمی دانم یک ValidationRules باید یک Dependency Property باشد یا اینکه می تواند یک ویژگی معمولی نیز باشد؟
کد بالا این خطا را در پی دارد:

{"Cannot add element to 'ValidationRules'; the property value is null.  Error at object 'LearningWPF.ValidationRules.NotNullOrEmptyValidationRule' in markup file 'LearningWPF;component/addcustomerwindow.xaml' Line 35 Position 66."}

Validation property مربوطه نیز در زیر آمده است:

 public static readonly DependencyProperty ValidationRulesProperty =
            DependencyProperty.Register("ValidationRules",
                                        typeof (Collection<ValidationRule>), typeof (RequiredTextBox),
                                        new FrameworkPropertyMetadata(null));

        public Collection<ValidationRule> ValidationRules
        {
            get { return (Collection<ValidationRule>)GetValue(ValidationRulesProperty); }
            set { SetValue(ValidationRulesProperty, value); }
        }

منبع :
stackoverflow

چه نوعی ValidationRules می باشد؟ این گونه بنظر می رسد که شما می خواهید یک oibject را به یک نوع مجموعه (collection) اضافه کنید بدون آنکه نمونه ای از Collection را ایجاد کرده باشید

(30 اوت '11, 05:01) hamedkh ♦

لازم است پیش از اضافه کردن چیزی به collection ، نمونه ای از آن را ایجاد کنید. در ایجاد کننده (constructor) مربوط به کلاس RequiredTextBox کد زیر را اضافه کنید:
ValidationRules = new Collection<validationrule>();
حال شما می توانید از طریق xaml آیتم هایی را به آن اضافه کنید

(30 اوت '11, 05:02) hamedkh ♦

ممنون.من فکر می کردم که آن را ایجاد می کنم اما کد مربوط به آن کامنت شده بود. ممنون از کمکتون.

(30 اوت '11, 05:02) hamedkh ♦

حالا در کد بالا من ValidationRules را بعنوان Dependency Property ایجاد نمودم. آیا دلیل خاصی برای آن وجود دارد؟ آیا به این دلیل من باید آن را بعنوان یک Dependency Property تعریف کنم که این ویژگی به خوبی یک ویژگی معمولی عمل می کند؟

(30 اوت '11, 05:02) hamedkh ♦
2 پاسخ

تکنولوژی WPF سرویس های جدیدی را برای گسترش خواص CLR در اختیار شما، قرار می دهد. این سرویس ها باعث می شود که بتوانید از این خواص در موارد زیادی از جمله متحرک سازی ها، استایل ها، قالب ها و عملیات بایند کردن و ... استفاده کنید. به چنین خواصی اصطلاحا Dependency Property می گویند.


اولا یک Dependency Property تنها زمانی ایجاد می گردد که مورد استفاده قرار بگیرد، این به این معنی است که کلاس TextBox ایجاد شده بسیار کارآمد می باشد. حافظه‌ی Footprint یا همان(memory footprint) بسیار کم می باشد زیرا تعداد property های حقیقی ای که باید در heap فضا اشغال کنند کمینه می شود. این مزیت در WPF بسیار پر اهمیت می گردد زیرا WPF ها مجموعه ای از انواع گوناگون می باشند. چنانچه هریک از این انواع داخلی ده ها property را بمنظور تعریف behavior ها ایجاد نمایند، یک کنترل سطح بالا نظیر button باعث می شود کلاسی با صد ها property در اندازه بسیار بزرگ داشته باشیم.
دوما Dependency Property ها را بیشتر می توان به object ها نسبت داد تا به انواعی که برای آنها ساخته می شوند. این مسئله باعث می شود که یک Control بتواند یک Grid.Column (که گرید می تواند آن را برای نمایش در Layout بخواند و استفاده نماید ) را مقدار دهی نماید. این بدین معنی است که نیازی به اجرای صد ها کلاس نمایش دهنده (که هرکدام قطعه ای مورد نیاز را برای کلاسی دیگر فراهم می آورند) نیست.بنابراین Xaml بیشتر قابل فهم و خواندن خواهد بود.
با وجود آنکه تعریف validation property بعنوان یک Dependency Property مزیت چندانی در بر ندارد( تنها مزیت آن در مورد مسئلهmemory footprint می باشد)،بخصوص در موردی که این ویژگی یک Text Property از یک Text Box می باشد که ممکن است توسط ورودی های دیگری نوشته یا تغییر پیدا کند،اما من باز هم آن را بعنوان یک Dependency Property ایجاد می کنم. دلیل من برای این کار بسیار واضح و روشن است: اگرچه این کار مزایای زیادی در پی ندارد، اما هزینه ای را هم برای شما در بر ندارد. من هرگز مایل به استفاده از property های معمولی در یک کنترل نبوده ام و همواره در حال تبدیل basic property های برنامه به Dependency Property ها هستم. زیرا باعث افزایش کارایی می گردد.
با وجود آنکه تعریف Dependency Property ها بسیار پیچیده تر از ویژگی های معمولی می باشد، اما من هنوز از آنها در کنترول های WPF استفاده میکنم مگر آنکه دلیله محکمی برای استفاده از چیزه دیگری وجود داشته باشد.

پست بروز شده را چک کنید

(30 اوت '11, 05:05) hamedkh ♦

آیا می توانید برای فهم بهتر مطلب یک جفت dependency Property را که از آنها در کنترل خود استفاده خواهید نمود، لیست نمایید؟

(30 اوت '11, 05:05) hamedkh ♦
toggle preview



آموزش زبان برنامه نویسی C#
آموزش jquery
آموزش برنامه نویسی
آموزش طراحی وبسایت
آموزش مدیریت وبسایت
آموزش جاوا Java
آموزش پایتون Python
آموزش سی شارپ C#‎
آموزش HTML و CSS
آموزش JavaScript جاوااسکریپت
آموزش jQuery جی کوئری
آموزش ساخت ربات تلگرام
آموزش برنامه‌نویسی PHP
آموزش برنامه‌نویسی اندروید
● آموزش‌های رایگان

سوالات مرتبط

راهنمای استفاده از ویرایشگر
  • *ایتالیک*‌ یا __ایتالیک__
  • **ضخیم** یا __ضخیم__
  • آدرس:[متن](http://url.com/ "عنوان")
  • عکس?![alt متن](/path/img.jpg "عنوان")
  • لیست عددی: 1. Foo 2. Bar
  • برای رفتن به خط بعد، هر جا مایلید که خط جدید شروع شود دو کاراکتر فاصله (space) قرار دهید
  • تگ‌های ساده HTML هم پشتیبانی می‌شوند

تگها:
این سوال را دنبال کنیدتوسط ایمیل: ایمیل شما (باید معتبر باشد, هرگز به دیگران نمایش داده نمیشود):

هنگامی که شما به سیستم وارد شوید،قادر خواهید بود برای بروز رسانی ها مشترک شوید.


توسط RSS:

پاسخها

پاسخها و نظرها