Создание Silverlight DataTemplate в коде

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

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

Ответы

Ответ 1

Хотя вы не можете его программно создать, вы можете загрузить его из строки XAML в коде следующим образом:

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

В приведенном выше фрагменте создается шаблон данных, содержащий один элемент управления, который может быть пользовательским элементом управления с нужным содержимым.

Ответ 2

У меня было несколько проблем с этим кодом, получив исключение элемента не foung. Просто для справки, это было то, что мне понадобилось мое пространство, включенное в 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);
        }

Ответ 3

Да, 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>

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

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

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

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

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

Ответ 4

цитата из MSDN:

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