سؤال

لقد بدأت مشروع هواية للتعرف على 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.GetPropertiesPropertyDescriptor يوفر ثروة من المعلومات حول كل عقار (على سبيل المثال، 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()

بالنسبة للأسئلة الأخرى...حسنًا، لم ألقي نظرة على الكود، لذلك لا أستطيع الإجابة ;)

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