Создание шаблона данных Silverlight в коде
-
09-06-2019 - |
Вопрос
Как создать шаблон данных 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>"
);
}
Это работает очень хорошо и позволяет мне менять привязку на лету.
Решение
Хотя вы не можете создать его программно, вы можете загрузить его из строки 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 слияния между ресурсами.В 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 имеет некоторые ограничения на создание полностью динамических шаблонов данных с кодом программной части. Даже он работает на WPF.
В любом случае лучшим решением на этом этапе является создание сценария XAML для шаблона данных. Вы можете указать некоторый элемент значений в сценарии DataTemplate.Мы создали наши собственные пользовательские элементы управления, имеющие некоторые свойства с DependencyObjectProperty...
Наконец, если ваш объект не имеет наследников, т.е.не MyControl:UserControl, который вы можете унаследовать МойОбъект:Объект Зависимости таким образом вы можете достичь своего объекта, вызвав Application.Current.Resources.FirstChilderen...
FindName работает только в WPF
Использование XAML, определяющее содержимое для создания шаблона данных, не предоставляется как настраиваемое свойство.Это особое поведение, встроенное в обработку XAML элемента объекта DataTemplate.