سؤال

أواجه صعوبة في معرفة أسباب وجيهة لخاصية التبعية. لماذا خاصية System.Controls.TextBox "Text" خاصية التبعية وليس خاصية عادية؟ ما هي الفوائد التي تخدم كونها ملكية التبعية؟

أحد الأشياء التي أحاول إنجازها هو إضافة خاصية التحقق من الصحة إلى UserControl التي ستحتوي على قواعد التحقق من الصحة الأخرى. مثلما هو الحال هنا:

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

المشكلة هي أنني لست متأكدًا مما إذا كانت خاصية ValityRules يجب أن تكون REPENDENDENTERTY أو مجرد خاصية عادية.

الرمز أعلاه يعطي الخطأ التالي:

{"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."}

هنا هي خاصية التحقق من الصحة:

 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); }
        }
هل كانت مفيدة؟

المحلول

الفوائد هي في المقام الأول أضعاف:

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

ثانياً ، يمكن ربط خصائص التبعية بكائن آخر غير النوع الذي تم إنشاؤه له. يتيح ذلك للحالة التي يمكن أن يؤدي فيها عنصر التحكم إلى تعيين شبكة. هذا يعني أننا لا نوفر مئات من فصول الديكور التي توفر قطعًا صغيرة من الوظائف التي تتطلبها الضوابط الأخرى. هذا يعني أن Xmal أكثر سهولة وقابلة للقراءة.


تم تحريره لمعالجة المثال في سؤالك المنقح:

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

ببساطة ، في حين أن خاصية التبعية أكثر تعقيدًا لتحديد أن الخاصية العادية التي ما زلت أستخدمها كمعيار فعلي لعناصر التحكم في WPF ما لم يكن هناك سبب وجيه للقيام بخلاف ذلك. بنفس الطريقة التي يكون بها خاصية ما هو المعيار للفئات ، على الرغم من أن الحقل أسهل في التنفيذ.

نصائح أخرى

الفوائد الأساسية التي أقولها هي:

  1. دعم ربط البيانات من الدرجة الأولى.
  2. تنظيف دلالات الممتلكات المرفقة
  3. قيم الخصائص التي "تعتمد".

تلك النقطة الأخيرة هي مفتاح

قبل خصائص التبعية ، يكون لها قيمة محلية ، وقيمة قابلة للرسوم ، وقيمة قابلة للتجاوز ، وقيمة قابلة للتصميح ، وتتطلب قيمة المعبد إعلان خصائص/حقول/القاموس المتعددة ، بالإضافة إلى إدارة الحالة المعقدة+الأسبقية.

تمنحك خصائص التبعية كل هذه الميزات خارج الصندوق ، مع إعلان خاصية واحدة فقط.

ومع ذلك ، في حالتك ، قد لا ترغب في الإعلان عن التحقق من الصحة باعتبارها بمثابة اعتماد إذا لم تكن بحاجة إلى الاستفادة من هذه الميزات.

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

ليس هناك فائدة من إعادة اختراع العجلة إلا إذا كنت تأكيد ستكون العجلة أفضل. تجربتي الشخصية هي أن عجلاتي التي أعيد اختراعها تميل إلى أن تكون أشياء مفقودة ؛).

كما أشار Martin Harris بالفعل ، يمكن لـ DependencyProperties أن تحد من بصمة الذاكرة من خلال إلقاء قيم الممتلكات في القاموس ، ومع ذلك ، يمكن (وأعتقد أنه كان؟) من قبل MSFT قبل ظهور DependencyProperties.

يذكر مارتن أيضًا الخصائص المرفقة ، ولكن كانت متوفرة أيضًا (على الأقل في المصمم) قبل ظهور DependencyProperties. تطبيق الخاصية المرفقة باستخدام DependencyProperties أكثر نظافة.

خصائص التبعية مطلوبة إذا كنت ترغب في استخدام الربط لملء قيمة الخاصية. إذا كانت مجرد خاصية عادية ، فلن تتمكن من ربط خاصية النص بخاصية لكائن نموذج العرض الخاص بك ، على سبيل المثال.

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