كيفية ملء خصائص جمع متعددة في عنصر XAML
-
25-09-2019 - |
سؤال
أقوم بإنشاء فصل يرث من System.Windows.Documents.Paragraph
ويضيف خاصية مجموعة جديدة. فيما يلي تمثيل مبسط للغاية لتلك الفئة:
public class ExtendedParagraph : Paragraph
{
public Dictionary<string, string> Attributes { get; set; }
}
أحتاج إلى إنشاء مثيل للفئة أعلاه من داخل XAML ، والذي يتطلب بناء جملة ترميز يسمح بمحتوى الفقرة وأعضاء مجموعة السمات الخاصة بها بشكل منفصل.
نظرًا لأن فئة الفقرة مزينة بالسمات [ContentProperty("Inlines")]
, ، أفترض أنني بحاجة إلى ملء الخطوط وتجمعات السمات صراحة. استنادًا إلى بناء جملة XAML الذي رأيته في حل تحديات مماثلة في مكان آخر ، أتصور شيئًا كهذا:
<ExtendedParagraph xmlns="clr-namespace:MyNamespace">
<ExtendedParagraph.Inlines>
This is where the paragraph content goes
</ExtendedParagraph.Inlines>
<ExtendedParagraph.Attributes>
This is where the members of the Attributes property are declared
</ExtendedParagraph.Attributes>
</ExtendedParagraph>
ومع ذلك ، يقدم هذا النهج مشكلتين:
1] عندما يتم تحليل XAML أعلاه باستخدام XamlReader ، فإنه يفشل في الرسالة "تم تعيين خاصية ExtendedParagraph.inlines بالفعل ويمكن تعيينها مرة واحدة فقط"
2] لست متأكدًا من العلامات التي يجب أن أستخدمها لإعلان مثيلات keyvaluepair ضمن عنصر السمات.
آمل أن يتمكن شخص ما من توجيهني في الاتجاه الصحيح.
شكرا جزيلا تيم
تحرير - لقد وجدت إجابة السؤال [1]. يستلزم ببساطة إعلان مجموعة السمات (باستخدام بناء جملة عنصر الخاصية) أولاً ، يليه محتوى الفقرة:
<ExtendedParagraph xmlns="clr-namespace:MyNamespace">
<ExtendedParagraph.Attributes>
This is where the members of the Attributes property are declared
</ExtendedParagraph.Attributes>
This is where the paragraph content goes
</ExtendedParagraph>
ومع ذلك ، فإن إضافة أعضاء إلى أ Dictionary<TKey, TValue>
يثبت أكثر صعوبة. لقد وجدت بعض القرائن في هذا المشنور, ، لكنني لم أحقق بعد نتيجة عمل. أفكارك لا تزال موضع ترحيب.
المحلول
لست متأكدًا مما إذا كان من المقبول الإجابة على سؤالي الخاص ، لكن بما أنه لا أحد يعرف ، سأشارك الحل الذي تبنته.
على ما يبدو ، فإن دعم الأدوية الجيرية في XAML محدود ، مما يعني أنه لا يوجد آلة XAML الأصلية لملء أ Dictionary<TKey, TValue>
(أو أي فئة تجميع عامة أخرى).
ولكن كما هذه المقالة يصف ، من الممكن إنشاء فئة ملحق مخصصة ، وبمجرد تكوينها لتناسب نوع عضو المجموعة ، ستقوم بنجاح بملء خاصية المجموعة بشكل تعريفي:
<ExtendedParagraph.Attributes>
<generic:DictionaryOfT TypeArgument="sys:String">
<generic:DictionaryOfT.Items>
<sys:String x:Key="String1">Hello</sys:String>
<sys:String x:Key="String2">World</sys:String>
</generic:DictionaryOfT.Items>
</generic:DictionaryOfT>
</ExtendedParagraph.Attributes>