Как программно изменить шаблон данных? - PullRequest
5 голосов
/ 14 декабря 2009

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

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

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 Ответ

1 голос
/ 15 декабря 2009

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

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

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

...