إنشاء Silverlight DataTemplate في التعليمات البرمجية

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

  •  09-06-2019
  •  | 
  •  

سؤال

كيف أقوم بإنشاء قالب بيانات Silverlight في التعليمات البرمجية؟لقد رأيت الكثير من الأمثلة لـ WPF، ولكن لا شيء لـ Silverlight.

يحرر:إليك الرمز الذي أستخدمه الآن، بناءً على إجابة سانتياغو أدناه.

public DataTemplate Create(Type type)
{
  return (DataTemplate)XamlReader.Load(
          @"<DataTemplate
            xmlns=""http://schemas.microsoft.com/client/2007"">
            <" + type.Name + @" Text=""{Binding " + ShowColumn + @"}""/>
            </DataTemplate>"
   );
}

يعمل هذا بشكل جيد حقًا ويسمح لي بتغيير الارتباط بسرعة.

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

المحلول

على الرغم من أنه لا يمكنك إنشائه برمجيًا، إلا أنه يمكنك تحميله من سلسلة XAML في التعليمات البرمجية مثل هذا:

    public static DataTemplate Create(Type type)
    {
        return (DataTemplate) XamlReader.Load(
            @"<DataTemplate
                xmlns=""http://schemas.microsoft.com/client/2007"">
                <" + type.Name + @"/>
              </DataTemplate>"
          );
    }

يقوم المقتطف أعلاه بإنشاء قالب بيانات يحتوي على عنصر تحكم واحد، والذي قد يكون عنصر تحكم مستخدم يحتوي على المحتويات التي تحتاجها.

نصائح أخرى

واجهت بعض المشكلات مع هذا الرمز، حيث لم أحصل على استثناءات للعنصر.للإشارة فقط، كنت بحاجة إلى تضمين مساحة الاسم الخاصة بي في DataTemplate...

private DataTemplate Create(Type type)
        {
            string xaml = @"<DataTemplate 
                xmlns=""http://schemas.microsoft.com/client/2007""
                xmlns:controls=""clr-namespace:" + type.Namespace + @";assembly=" + type.Namespace + @""">
                <controls:" + type.Name + @"/></DataTemplate>";
            return (DataTemplate)XamlReader.Load(xaml);
        }

نعم، Silverligt 4 أقدم من الإصدارات الحالية لـ WPF.عند إضافة قالب كمورد، على سبيل المثال.كما فعلت ، أضفت قالب USERCONTROL في application.xaml musedResources بين الموارد.في XAML، إذا قامت العلامة بتطبيق IDictionary، فيمكنك استخدام x:Key attribute.مثل هذا

   <ResourceDictionary>
    <DataTemplate x:Key="TextBoxEditTemplate">
    <Some user control x:Name="myOwnControl" />
    </DataTemplate>
   </ResourceDictionary>

نعم!يمكنك الوصول إلى القالب الخاص بك عن طريق ترميز ذلك، Application.Current.resources["TextBoxEditTemplate"]ومن ناحية أخرى فإن بعض الطرق للعثور على أعضاء هذا القالب لن تعمل.بجانب هذا DataTemplate لا يقوم بتطبيق IDictionary لذا لا يمكنك تعيين x: سمة مفتاح للعناصر الموجودة في dataTemplate هذا.مثل myOwnControl في المثال.

بدون xaml، يوجد لدى Silverlight الحالي بعض القيود حول إنشاء تعليمات برمجية ديناميكية بالكامل خلف DataTemplates. حتى أنه يعمل على WPF.

على أي حال، فإن الحل الأفضل في هذه المرحلة هو إنشاء برنامج نصي XAML لقالب البيانات، ويمكنك إضافة بعض عناصر القيم في البرنامج النصي DataTemplate.لقد أنشأنا عناصر تحكم المستخدم الخاصة بنا والتي تحتوي على بعض الخصائص باستخدام DependencyObjectProperty...

أخيرًا، إذا لم يكن لكائنك أي وراثة، على سبيل المثال.ليس MyControl:UserControl الذي قد ترثه MyObject:DependencyObject بهذه الطريقة يمكنك الوصول إلى الكائن الخاص بك عن طريق الاتصال مثل Application.Current.Resources.FirstChilderen...

يعمل FindName فقط في WPF

الاقتباس من MSDN:

لا يتم عرض استخدام XAML الذي يحدد المحتوى لإنشاء قالب بيانات كخاصية قابلة للتعيين.إنه سلوك خاص مضمن في معالجة XAML لعنصر كائن DataTemplate.

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