Создание шаблона данных Silverlight в коде - PullRequest
28 голосов
/ 12 сентября 2008

Как мне создать шаблон данных 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 ]

39 голосов
/ 16 сентября 2008

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

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

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

11 голосов
/ 10 декабря 2008

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

Да, 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 для элементов в этом dataTemplate. как myOwnControl в примере.

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

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

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

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

2 голосов
/ 15 сентября 2008

цитата из MSDN :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...