Создание 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.