خصائص تبعية WPF:لماذا أحتاج إلى تحديد نوع المالك؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

هذه هي الطريقة التي أسجل بها أ DependencyProperty:

    public static readonly DependencyProperty UserProperty = 
        DependencyProperty.Register("User", typeof (User), 
             typeof (NewOnlineUserNotifier));                                                                                                                 


    public User User
    {
        get
        {
            return (User)GetValue(UserProperty);
        }
        set
        {
            SetValue(UserProperty, value);
        }
    }

المعلمة الثالثة DependencyProperty.Register تتطلب منك الطريقة تحديد نوع عنصر التحكم الذي توجد به خاصية التبعية (في هذه الحالة، يسمى عنصر تحكم المستخدم الخاص بي NewOnlineUserNotifier).

سؤالي هو، لماذا تحدد نوع المالك فعلياً، وماذا يحدث إذا حددت نوعاً مختلفاً عن نوع المالك الفعلي؟

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

المحلول

النوع الذي تستدعي منه طريقة التسجيل ليس هو المالك الفعلي للعقار، وبالتالي لا يمكنك تحديد نوع مختلف عن المالك الفعلي نظرًا للنوع الذي تحدده يكون المالك الفعلي.

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

public class ButtonContainer : Control
{
    public Button ChildButton { get; set; }

    public static readonly DependencyProperty FirstOwnerProperty =
    DependencyProperty.Register("FirstOwner", typeof(ButtonContainer),
         typeof(Button));

    public ButtonContainer()
    {
        ChildButton = new Button();
        ChildButton.SetValue(FirstOwnerProperty, this);
    }

}

الآن يحتوي الزر على خاصية إضافية تكون منطقية فقط في سياق ButtonContainer ولا يمكن الوصول إليها إلا في سياق ButtonContainer - مثل علامة مغلفة وآمنة.

باستخدام الطبقة الجديدة على النحو التالي:

ButtonContainer container1 = new ButtonContainer();

ButtonContainer container2 = new ButtonContainer();
container2.ChildButton = container1.ChildButton;

أثناء نقل ChildButton من حاوية إلى أخرى، تنتقل معه قيمة FirstOwnerProperty كما لو كان عضوًا حقيقيًا في فئة Button.يمكن لـ Container2 الاتصال بـ ChildButton.GetValue(FirstOwnerProperty) ومعرفة ButtonContainer الذي أنشأ الزر في الأصل (يتم ترك سبب رغبته في القيام بذلك كتمرين للقارئ...).كل هذا ممكن دون الحاجة إلى تصنيف الزر إلى تخصص ضيق.

نصائح أخرى

وذلك لأنه يمكن تعريف نفس DependencyProperty بشكل مختلف (مع بيانات تعريف مختلفة) لعدة أنواع

باختصار، عندما تقوم بتسجيل DP، فإنك تضيف كائنًا (DP) إلى قائمة مرفقة بفئة (مالك).هذه العملية "تعيش" فقط في الفصل الذي تم الإعلان عنه، وغالبًا ما لا تكون مرتبطة بها.

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