إضافة datatemplate (غير xaml) إلى قاموس الموارد في الكود؟
-
21-09-2019 - |
سؤال
أحاول معرفة كيفية إضافة datatemplate إلى قاموس موارد التطبيق. أنا على دراية بكيفية القيام بذلك عندما يكون datatemplate في XAML (عبر URI) ، لكنني غامض في كيفية القيام بذلك عند تعريف datatemplate في الكود.
ما لدي ، والذي لا يعمل هو-
//Create DataTemplate
DataTemplate template = new DataTemplate(typeof(CoordinateViewModel));
FrameworkElementFactory ViewStack = new FrameworkElementFactory(typeof(CoordinateView));
ViewStack.Name = "myViewStack";
template.VisualTree = ViewStack;
ResourceDictionary dictionary = new ResourceDictionary();
dictionary.BeginInit();
dictionary.Add(template, template);
dictionary.EndInit();
App.Current.Resources.MergedDictionaries.Add(dictionary);
تحرير: بأفضل ما أستطيع أن لا يجعله datatemplate في قاموس موارد التطبيق ، على الرغم من عدم إلقاء أي أخطاء. عندما يتم استدعاء ViewModel لاحقًا من XAML ، فإنه يتصرف كما لو كان لا يوجد datatemplate مناسب لعرضه. علي سبيل المثال،
<StackPanel>
<ContentPresenter Content="{Binding ViewModel}" />
</StackPanel>
النتائج في نافذة فارغة مع النص "shellprototype.viewmodels.coordinateViewModel" المعروض ، على سبيل المثال ، لا يحتوي على قالب لعرض العرض.
المحلول
المفتاح هنا ، من أجل جعل هذا العمل بشكل صحيح ، هو الاستخدام datatemplatekey:
ResourceDictionary dictionary = new ResourceDictionary();
dictionary.Add(new DataTemplateKey(typeof(CoordinateViewModel)), template);
إذا قمت بذلك ، فيجب أن تعمل كما هو محدد. ومع ذلك ، فإن FrameworkElementFactory هو ، وفقًا للمستندات ، "طريقة تم إهمالها لإنشاء قوالب برمجيًا" ، لذلك قد ترغب في تحليل XAML مباشرة.