2009-12-14 5 views
5

J'essaie d'ajouter par programme des événements et des éléments à un DataTemplate dans une application Silverlight 3.0. J'ai un contrôle d'utilisateur avec une propriété de dépendance où je voudrais prendre le modèle qui est défini, le modifier, puis définir la version modifiée à un contrôle interne. L'idée que je ai est de prendre le DataTemplate qui vient, lire son XAML, le modifier, puis utiliser le XamlReader pour créer un DataTemplate modifié qui peut ensuite être défini sur le contrôle interne. Le problème avec cette approche est que je ne sais pas comment obtenir le XAML à partir du modèle originalal Par exemple (s'il est encore possible.):Comment modifier un DataTemplate par programme?

protected virtual void OnItemTemplateChanged(DependencyPropertyChangedEventArgs e) 
{ 
    // Get the original Xaml from the set template 
    //string originalXaml = ??? 

    // Modify the template 
    string newXaml = originalXaml.Replace("foo", "bar"); // for example 

    // Create a new template from the modified XAML 
    DataTemplate newTemplate = (DataTemplate)XamlReader.Load(newXaml); 

    // Update the inner template 
    this._childDropdown.ItemTemplate = newTemplate; 
} 

Est-ce que quelqu'un sait soit: 1) s'il y a un moyen de lire le XAML d'origine, ou 2) une autre approche pour modifier par programmation le DataTemplate.

Merci,

Répondre

1

Vous ne pouvez pas manipuler le modèle via le code (voir la documentation FrameworkTemplate). Le plus proche que vous obtiendrez est d'appeler le LoadContent de DataTemplate pour créer une instance du Xaml contenu, mais vous ne pouvez pas utiliser cela pour manipuler le contenu et il n'y a aucun moyen à l'intérieur de Silverlight de convertir un UIElement en Xaml.

Le plus proche que je pense que vous pouvez obtenir est de faire de votre objet de dépendance un Uri pointant vers une ressource Xaml qui contient le DataTemplate initial.

Vous pouvez ensuite charger cette ressource dans un XDocument et la manipuler au format XML. Par la suite, vous pouvez utiliser XamlReader pour indiquer le DataTemplate et l'affecter à ItemTemplate.

+0

J'ai (à contrecoeur) retravaillé mon projet de sorte qu'il ne nécessite pas de manipulation du DataTemplate. Ce n'est pas ce que je voulais, mais au moins je ne perds plus de temps à essayer de faire ça. Merci, j'espère qu'une future version de Silverlight permettra une manipulation programmatique du DataTemplate. –

+0

Je pense que ce que je voudrais voir comme la possibilité de remplacer un ItemContainerGenerator ItemsControl avec générateur personnalisé que nous ne pouvons pas pour le moment, je vais devoir chercher SL4 voir si cela permet cela. – AnthonyWJones

Questions connexes