Создание шаблона данных Silverlight в коде

Как создать шаблон данных 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>"
   );
}

Это работает очень хорошо и позволяет мне менять привязку на лету.

4 ответа

Решение

Хотя вы не можете создать его программно, вы можете загрузить его из строки 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 MergedResources между ResourceDictionary. В XAML, если тег реализует IDictionary, вы можете использовать атрибут x:Key. Как это

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

Хорошо! Вы можете получить доступ к своему шаблону, написав, что Application.Current.resources["TextBoxEditTemplate"], с другой стороны, некоторые методы поиска членов этого шаблона не будут работать. Кроме этого DataTemplate не реализует IDictionary, поэтому вы не можете назначить атрибут x:Key для элементов в этом dataTemplate. как myOwnControl в примере.

Без xaml у текущего silverlight есть некоторые ограничения на создание полностью динамического кода позади DataTemplates. Даже он работает на WPF.

В любом случае, лучшим решением на данный момент является создание XAML-сценария для datatemplate. Вы можете использовать некоторые значения элемента в сценарии DataTemplate. Мы создали наши собственные usercontrols имеет некоторые свойства с DependencyObjectProperty...

Наконец, если ваш объект не имеет наследников, то есть не MyControl:UserControl, вы можете наследовать MyObject:DependencyObject, таким образом вы можете добраться до своего объекта, вызвав как Application.Current.Resources.FirstChilderen...

FindName работает только в WPF

Цитата из MSDN:

Использование XAML, определяющее содержимое для создания шаблона данных, не предоставляется в качестве настраиваемого свойства. Это специальное поведение, встроенное в обработку XAML элемента объекта DataTemplate.

Другие вопросы по тегам