Pergunta

Como faço para criar um modelo de dados do Silverlight no código?Já vi muitos exemplos para WPF, mas nada para Silverlight.

Editar:Aqui está o código para o qual estou usando agora, com base na resposta de Santiago abaixo.

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

Isso funciona muito bem e me permite alterar a ligação rapidamente.

Foi útil?

Solução

Embora não seja possível criá-lo programaticamente, você pode carregá-lo a partir de uma string XAML em um código como este:

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

O trecho acima cria um modelo de dados contendo um único controle, que pode ser um controle de usuário com o conteúdo que você precisa.

Outras dicas

Tive alguns problemas com esse código, obtendo exceções de elementos sem encontrar.Apenas para referência, eu precisava que meu namespace fosse incluído no 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);
        }

Sim, Silverligt 4 é mais antigo que as versões atuais do WPF.Quando você adiciona um modelo como um recurso, ou seja,como eu fiz Adicionei um modelo userControl em Application.xaml MergedResources entre ResourceDictionary.Em XAML, se a tag implementasse o IDictionary, você poderia usar o atributo x:Key.Assim

   <ResourceDictionary>
    <DataTemplate x:Key="TextBoxEditTemplate">
    <Some user control x:Name="myOwnControl" />
    </DataTemplate>
   </ResourceDictionary>

OK!Você pode chegar ao seu modelo codificando isso, Application.Current.resources["TextBoxEditTemplate"]por outro lado, alguns métodos para localizar membros deste modelo não funcionarão.Além disso, DataTemplate não implementa IDictionary, portanto você não pode atribuir o atributo x:Key para itens neste dataTemplate.como myOwnControl no exemplo.

Sem xaml o Silverlight atual tem algumas restrições sobre a criação de DataTemplates de código totalmente dinâmico. Mesmo que funcione no WPF.

De qualquer forma, a melhor solução neste ponto é a criação de um script XAML para datatemplate. Você pode atribuir algum elemento de valores no script DataTemplate.Criamos nossos próprios usercontrols com algumas propriedades com DependencyObjectProperty...

Por fim, se o seu objeto não tiver heranças, ou seja,não é um MyControl:UserControl que você pode herdar MeuObjeto:DependencyObject desta forma você pode alcançar seu objeto chamando como Application.Current.Resources.FirstChilderen...

FindName funciona apenas no WPF

citação do MSDN:

O uso de XAML que define o conteúdo para criar um modelo de dados não é exposto como uma propriedade configurável.É um comportamento especial incorporado ao processamento XAML de um elemento de objeto DataTemplate.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top