2009-12-14 3 views
5

Ich versuche, Ereignisse und Elemente zu einer DataTemplate in einer Silverlight 3.0 App programmgesteuert hinzuzufügen. Ich habe ein Benutzersteuerelement mit einer Abhängigkeitseigenschaft, in der ich die eingestellte Vorlage übernehmen, optimieren und dann die modifizierte Version als inneres Steuerelement festlegen möchte.Wie programmiere ich ein DataTemplate?

Die Idee, die ich habe, ist, das DataTemplate zu nehmen, lesen Sie seine XAML, zwicken Sie es und verwenden Sie dann den XamlReader, um eine modifizierte DataTemplate zu erstellen, die dann auf das innere Steuerelement gesetzt werden kann. Das Problem bei diesem Ansatz ist, ich weiß nicht, wie die XAML aus der originalal Vorlage erhalten zum Beispiel (wenn es überhaupt möglich ist.):

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

Kennt jemand entweder: 1), wenn es eine Möglichkeit gibt, zu lesen das ursprüngliche XAML oder 2) eine andere Methode, das DataTemplate programmgesteuert zu ändern.

Danke,

Antwort

1

Sie die Vorlage nicht über Code manipulieren kann (siehe Dokumentation für FrameworkTemplate). Der nächste, den Sie erhalten werden, ist, die LoadContent der DataTemplate aufzurufen, um eine Instanz des enthaltenen Xaml zu erstellen, aber Sie können damit den Inhalt nicht manipulieren und es gibt keinen Weg innerhalb von Silverlight, um wieder eine UIElement nach Xaml zu konvertieren.

Die nächste Möglichkeit, die Sie erreichen können, besteht darin, Ihr Abhängigkeitsobjekt zu einem Uri zu machen, das auf eine Xaml-Ressource zeigt, die das ursprüngliche DataTemplate enthält.

Sie können diese Ressource dann in eine XDocument laden und als XML bearbeiten. Anschließend können Sie XamlReader verwenden, um das DataTemplate zu instanzieren und es ItemTemplate zuzuweisen.

+0

Ich (widerwillig) überarbeitet mein Projekt, so dass es keine Manipulation des DataTemplate erfordert. Es ist nicht das, was ich wollte, aber zumindest verschwende ich keine Zeit mehr, um das zu versuchen. Danke, ich hoffe, dass eine zukünftige Version von Silverlight eine programmatische Manipulation des DataTemplate erlaubt. –

+0

Ich denke, was ich als die Fähigkeit sehen möchte, einen ItemsControl ItemContainerGenerator durch einen benutzerdefinierten Generator zu ersetzen, was wir im Moment nicht können, muss ich SL4 nachsehen, ob es das erlaubt. – AnthonyWJones