الاعتماد على كائن التبعية وخصائص التبعية

StackOverflow https://stackoverflow.com/questions/156538

  •  03-07-2019
  •  | 
  •  

سؤال

أقوم بإنشاء تطبيق Silverlight وكان أحد التحذيرات التي قمت بها في المرة الأخيرة هو أنه إذا كنت بحاجة إلى القيام بأي شيء بشكل صحيح بطريقة Silverlight/WPF فستحتاج إلى تصميم كائناتك على أنها DependecyObject واستخدام DependencyProperty(ies)

أجد هذا النموذج مرهقًا إلى حد ما، ويتطلب حقولًا ثابتة ومهيئات في نصف الفئات التي أستخدمها، فهل من الجيد استخدام النموذج القديم القائم على الحدث (نمط المراقب؟) بدلاً من DependencyObject؟

أهدف إلى تقليل تضخم التعليمات البرمجية وألواح الغلايات (أنا أكرهها) وأود حقًا معرفة ما إذا كان لدى أي شخص لديه خبرة في Silverlight/WPF أي نصائح/تقنيات للحفاظ على استخدام DependencyObject وDependencyProperty إلى الحد الأدنى؟

هل هذه فكرة جيدة؟

هل كانت مفيدة؟

المحلول

في الواقع، في Silverlight لا يمكنك وراثة DependencyObjects، ولذلك يجب (ويتعين عليك) تنفيذ INotifyPropertyChanged بدلاً من ذلك.

يتمتع تطبيق INotifyPropertyChanged بالعديد من المزايا مقارنة بـ DependencyObjects (سأختصر هذا DO لتسهيل الأمر) واستخدام DependencyProperties (DPs):

  • هذا هو أكثر خفيفة الوزن
  • يتيح لك المزيد من الحرية في نمذجة الأشياء الخاصة بك
  • يمكن إجراء تسلسل بسهولة
  • يمكنك رفع الحدث عندما تريد، وهو ما يمكن أن يكون مفيدًا في سيناريوهات معينة، على سبيل المثال عندما تريد تجميع تغييرات متعددة في عملية واجهة مستخدم واحدة فقط، أو عندما تحتاج إلى رفع الحدث حتى إذا لم تتغير البيانات (إلى إعادة رسم القوة ...)

من ناحية أخرى، فإن وراثة المهام المحددة في WPF لها المزايا التالية:

  • أسهل في التنفيذ خاصة للمبتدئين.
  • تحصل على آلية رد اتصال (تقريبًا) مجانًا، مما يسمح لك بإخطارك عند تغير قيمة الخاصية
  • يمكنك الحصول على آلية إكراه تسمح لك بتحديد قواعد الحد الأقصى والحد الأدنى والقيمة الحالية للعقار.

هناك اعتبارات أخرى، ولكن هذه هي الرئيسية.

أعتقد أن الإجماع العام هو أن DPs رائعة لعناصر التحكم (ويمكنك تنفيذ CustomControl باستخدام DPs مخصصة حتى في Silverlight)، ولكن بالنسبة لكائنات البيانات، يجب عليك بدلاً من ذلك تنفيذ INotifyPropertyChanged.

HTH ، لوران

نصائح أخرى

وانها حقا يتوقف على الكائنات التي كنت تقصد. إذا كان الغرض من الكائن إلى الجلوس في شجرة XAML، قصارى جهدها لاستخدام DependencyProperties (وبالتالي يرث DependencyObject - التي تفعل كل UIElements) للسماح لجميع الفوائد التي توفر DependencyProperties (يجري animatable، ملزمة، واختياري الميراث الطفل التلقائي، الخ). أنا أوصي تقرأ نظرة عامة على MSDN DependencyProperties إذا كنت ملاذ ' ر بالفعل.

إذا كان الكائن كيان البيانات (أي كنت ملزمة قيمها TO شيء في شجرة XAML) ثم ليست هناك حاجة إلى وراثة من DependencyObject. إذا كانت الخصائص على الكائن قراءة والكتابة قد ترغب في تنفيذ <وأ href = "http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx" يختلط = "نوفولو noreferrer" > INotifyPropertyChanged ، الأمر الذي سيتيح ربط لتحديث تلقائيا عند تغيير قيمة.

وأنا أتفق مع ريتشارد أن ذلك يعتمد على الغرض من الفصول الدراسية، ولكن كملاحظة يبدو أنك يمكن أن ترث من DependencyObject مباشرة في Silverlight 2.0 الإصدار، دون الحاجة إلى وراثة من UIElement أو UserControl. على الأقل، أنا أفعل ذلك في بلدي (سيلفرلايت 2.0 RTW) التطبيق.

System.Windows.DependencyObject على MSDN

<اقتباس فقرة>   

ومن على يست نموذجية لمستمدة مباشرة من DependencyObject لمعظم السيناريوهات. وبدلا من ذلك قد تجنيها من تحكم معينة، من واحدة من الفئات الأساسية التحكم (ContentControl، تحكم، ItemsControl)، من FrameworkElement، أو من الطبقات غير المراقبة التي لا تزال تشارك في واجهة المستخدم مثل لوحة أو الشبكة. المستمدة من DependencyObject قد يكون مناسبا إذا كنت تقوم بتعريف كائن عمل أو تخزين البيانات حيث تريد خصائص التبعية لتكون نشطة، أو إذا كنت تقوم بإنشاء فئة خدمات الدعم التي من شأنها أن تملك العقارات المرفقة.

وHTH

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top