Создание шаблона данных Silverlight в коде

StackOverflow https://stackoverflow.com/questions/59451

  •  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

цитата из MSDN:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top