WPF "Magic" في عنصر تحكم PropertyGrid
-
10-07-2019 - |
سؤال
لقد بدأت مشروع هواية للتعرف على WPF وفي بحثي عثرت على WPF PropertyGrid http://www.codeplex.com/wpg
لقد قمت بتحميل المصدر من http://wpg.codeplex.com/SourceControl/ListDownloadableCommits.aspx، وبدأت في تصفحه، يبدو رائعًا، ويعمل.لكن طوال حياتي، لا أستطيع معرفة كيف يعمل ذلك.الأسئلة التالية هي ما تبقى لي للوهلة الأولى.
- كيف يعرف ما هي خصائص الكائن؟
- كيف يتم عرض عنصر التحكم لتحرير القيمة؟
- كيف تقرر ما هو التحكم الذي سيتم عرضه؟(أعتقد أن أوصاف البيانات الوصفية على الخصائص)
أفهم أن DependancyProperties تتعامل مع تبادل البيانات بين القيم الجديدة.
- أين يوجد كود XAML أو CodeBehind الذي يقوم بكل السحر؟
يوجد الكثير من أكواد XAML البرمجية في ملف Default.xaml، ولكن بقدر ما أستطيع أن أقول إنها فقط الأنماط والمظاهر التي تم تعريفها هناك.
المحلول
- كيف يعرف ما هي خصائص الكائن؟
يستخدم System.ComponentModel.TypeDescriptor
لتحديد الخصائص التي يمتلكها النوع عبر TypeDescriptor.GetProperties
.أ PropertyDescriptor
يوفر ثروة من المعلومات حول كل عقار (على سبيل المثال، PropertyDescriptor.IsReadOnly
سيخبرك أن الخاصية للقراءة فقط).وعلاوة على ذلك، باستخدام PropertyDescriptor.GetValue
و PropertyDescriptor.SetValue
, يمكن الحصول على قيم الخصائص وكتابتها.
- كيف يتم عرض عنصر التحكم لتحرير القيمة؟
- كيف تقرر ما هو التحكم الذي سيتم عرضه؟(أعتقد أن أوصاف البيانات الوصفية على الخصائص)
ويستخدم عنصر تحكم مخصص يسمى أ PropertyGrid
الذي يعرض ObservableCollection
ل Item
س. Item
هي مجرد فئة أساسية لكائن النموذج الأساسي وهو Property
. Property
يكشف النوع الأساسي (PropertyDescritor.PropertyType
) من الممتلكات ويكشف PropertyDescriptor.GetValue
و PropertyDescriptor.SetValue
طرق عبر Property.Value
.وهذا بدوره هو ما لا بد منه لتمكين التحرير. DataTemplate
س هي المفتاح هنا.هناك عدد قليل من أنواع CLR مخصصة DataTemplate
التي تعرض عناصر التحكم التي تراها.على سبيل المثال، Boolean
يتم تقديم النوع كـ a CheckBox
بينما Enum
يتم تقديمه كـ ComboBox
.الافتراضي DataTemplate
هو TextBox
.
- أين يوجد كود XAML أو CodeBehind الذي يقوم بكل السحر؟
الميل إليه في Themes\Default.xaml
.
ويمكن تلخيص الكود على هذا النحو.توجد بيانات(Data\Property
) الذي يقوم بتغليف المعلومات حول خصائص الكائن ويوفر خاصية (Property.Value
) لقراءة وكتابة قيمة العقار.يتم كشف هذه البيانات باعتبارها ObservableCollection
في عنصر تحكم مخصص (PropertyGrid
) والتي يتم تقديمها باستخدام DataTemplate
في Themes\Default.xaml
.
يوجد الكثير من أكواد XAML البرمجية في ملف Default.xaml، ولكن بقدر ما أستطيع أن أقول إنها فقط الأنماط والمظاهر التي تم تعريفها هناك.
لا تغفل عن DataTemplate
س.
نصائح أخرى
- كيف يعرف ما هي خصائص الكائن؟
إذا كانت تعمل بنفس طريقة شبكة خصائص Windows Forms، فإنها تقوم بما يلي:
- إذا كان الكائن يطبق ICustomTypeDescriptor، فاحصل على الخصائص من هذه الواجهة (باستخدام أسلوب GetProperties)
- بخلاف ذلك، استخدم الانعكاس على نوع الكائن (obj.GetType().GetProperties()
بالنسبة للأسئلة الأخرى...حسنًا، لم ألقي نظرة على الكود، لذلك لا أستطيع الإجابة ;)