2009-12-14 17 views
5

Sto cercando di aggiungere eventi ed elementi a un DataTemplate in modo programmatico in un'applicazione Silverlight 3.0. Ho un controllo utente con una proprietà di dipendenza in cui vorrei prendere il modello impostato, modificarlo e quindi impostare la versione modificata su un controllo interno.Come modificare un DataTemplate al livello di programmazione?

L'idea che ho è prendere il DataTemplate che viene fornito, leggere il suo XAML, modificarlo e quindi usare XamlReader per creare un DataTemplate modificato che può quindi essere impostato sul controllo interno. Il problema con questo approccio è che non so come ottenere il XAML dal modello originalal Per esempio (se è ancora possibile.):

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; 
} 

Qualcuno sa sia: 1) se c'è un modo per leggere l'originale XAML o 2) un altro approccio per modificare a livello di codice il DataTemplate.

Grazie,

risposta

1

Non si può manipolare il modello tramite codice (vedere la documentazione per FrameworkTemplate). Il più vicino che si ottiene è chiamare il DataTemplate LoadContent per creare un'istanza del contenuto Xaml ma non è possibile utilizzarlo per manipolare il contenuto e non c'è alcun modo in Silverlight per convertire nuovamente uno UIElement in Xaml.

Il più vicino che penso si possa ottenere è di rendere l'oggetto di dipendenza un Uri che punta a una risorsa Xaml che contiene il DataTemplate iniziale.

È quindi possibile caricare questa risorsa in un XDocument e manipolarlo come XML. Successivamente è possibile utilizzare XamlReader ad esempio DataTemplate e assegnarlo a ItemTemplate.

+0

I (a malincuore) ha rielaborato il mio progetto in modo che non richieda la manipolazione del DataTemplate. Non è quello che volevo ma almeno non sto perdendo altro tempo cercando di farlo. Grazie, spero che una versione futura di Silverlight consenta alcune manipolazioni programmatiche del DataTemplate. –

+0

Penso a quello che mi piacerebbe vedere come la possibilità di sostituire un ItemContainerGenerator ItemsControl con un generatore personalizzato che non possiamo al momento, dovrò cercare SL4 per vedere se lo consente. – AnthonyWJones

Problemi correlati