Question

Comment créer un modèle de données Silverlight dans le code ?J'ai vu beaucoup d'exemples pour WPF, mais rien pour Silverlight.

Modifier:Voici le code pour lequel j'utilise maintenant, basé sur la réponse de Santiago ci-dessous.

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

Cela fonctionne vraiment bien et me permet de changer la fixation à la volée.

Était-ce utile?

La solution

Bien que vous ne puissiez pas le créer par programme, vous pouvez le charger à partir d’une chaîne XAML dans un code comme celui-ci :

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

L'extrait ci-dessus crée un modèle de données contenant un seul contrôle, qui peut être un contrôle utilisateur avec le contenu dont vous avez besoin.

Autres conseils

J'ai eu quelques problèmes avec ce code, obtenant des exceptions d'élément non trouvées.Juste pour référence, j'avais besoin d'inclure mon espace de noms dans le 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);
        }

Oui, Silverligt 4 est plus ancien que les versions actuelles de WPF.Lorsque vous ajoutez un modèle en tant que ressource, c'est-à-direComme je l'ai fait, j'ai ajouté un modèle UserControl dans Application.xaml MergedResources entre les ressources.En XAML, si la balise implémentait IDictionary, vous pouvez utiliser l'attribut x:Key.Comme ça

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

D'accord!Vous pouvez accéder à votre modèle en codant cela, Application.Current.resources["TextBoxEditTemplate"]par contre certaines méthodes pour trouver des membres de ce template ne fonctionneront pas.À côté de ce DataTemplate n'implémente pas IDictionary, vous ne pouvez donc pas attribuer l'attribut x:Key aux éléments de ce dataTemplate.comme myOwnControl dans l'exemple.

Sans Xaml, Silverlight actuel a certaines restrictions concernant la création de DataTemplates entièrement dynamiques avec code-behind. Même cela fonctionne sur WPF.

Quoi qu'il en soit, la meilleure solution à ce stade est la création d'un script XAML pour datatemplate. Vous pouvez attribuer certains éléments de valeurs dans le script DataTemplate.Nous avons créé nos propres contrôles utilisateur avec certaines propriétés avec DependencyObjectProperty...

Enfin, si votre objet n'a pas d'héritage, c'est-à-direpas un MyControl:UserControl dont vous pouvez hériter MonObjet : Objet de Dépendance de cette façon, vous pouvez atteindre votre objet en appelant comme Application.Current.Resources.FirstChilderen...

FindName fonctionne uniquement dans WPF

citation de MSDN:

L'utilisation XAML qui définit le contenu pour la création d'un modèle de données n'est pas exposée en tant que propriété définissable.Il s'agit d'un comportement spécial intégré au traitement XAML d'un élément d'objet DataTemplate.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top