2009-12-14 2 views
5

Я пытаюсь программно добавить события и элементы в DataTemplate в приложении Silverlight 3.0. У меня есть User Control с свойством dependency, где я хотел бы взять шаблон, который установлен, настроить его, а затем установить измененную версию на внутренний элемент управления.Как программно изменить DataTemplate?

Идея, которую я имею, заключается в том, чтобы взять DataTemplate, который входит, прочитать его XAML, настроить его, а затем использовать XamlReader для создания измененного DataTemplate, который затем может быть установлен на внутренний элемент управления. Проблема с этим подходом, я не знаю, как получить код XAML от originalal шаблона Например (если это вообще возможно.):

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

знает кто-либо: 1) если есть способ читать исходный XAML или 2) другой подход к программному изменению DataTemplate.

Спасибо,

ответ

1

Вы не можете изменить шаблон с помощью кода (см документации для FrameworkTemplate). Самое близкое, что вы собираетесь получить, - это вызвать DataTemplate LoadContent, чтобы создать экземпляр содержащегося Xaml, но вы не можете использовать его для управления содержимым, и в Silverlight нет способа конвертировать UIElement обратно в Xaml.

Ближайшее, я думаю, вы можете сделать это, чтобы сделать ваш объект зависимостей Uri, указывающим на ресурс Xaml, который содержит исходный DataTemplate.

Вы можете загрузить этот ресурс в XDocument и управлять им как XML. Впоследствии вы можете использовать XamlReader, например, DataTemplate и назначить его ItemTemplate.

+0

Я (неохотно) переработал свой проект, чтобы он не нуждался в манипуляции с DataTemplate. Это не то, что я хотел, но по крайней мере я больше не трачу время на это. Спасибо, надеюсь, что будущая версия Silverlight допускает некоторые программные манипуляции с DataTemplate. –

+0

Я думаю, что я хотел бы видеть как возможность заменить ItemControl ItemContainerGenerator на пользовательский генератор, которого мы не можем на данный момент, мне придется искать SL4, если это разрешено. – AnthonyWJones

Смежные вопросы