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