Проблемы с генерацией XamlReader DataTemplate - PullRequest
5 голосов
/ 24 августа 2011

Я пытаюсь реализовать приведенный ниже код в своем проекте WPF, чтобы на лету генерировать шаблоны данных для DataGrid с динамическими столбцами. Я нашел код на StackOverflow здесь

public DataTemplate Create(Type type)
{
  return (DataTemplate)XamlReader.Load(
          @"<DataTemplate
            xmlns=""http://schemas.microsoft.com/client/2007"">
            <" + type.Name + @" Text=""{Binding " + ShowColumn + @"}""/>
            </DataTemplate>"
   );
}

Однако в коде XamlReader.Load я получаю сообщение об ошибке "не удалось преобразовать строку" в строку "System.Xaml.XamlReader".

Я попытался обойти это, изменив код на:

return (DataTemplate)XamlReader.Load(XmlReader.Create(

но я получаю ошибки о передаче недопустимых символов в строке.

Кроме того, я не уверен, как передать TextBlock в этот код. Я предполагал, что просто создаю TextBlock и передаю его в качестве аргумента Type, но я получаю сообщение об ошибке "не могу преобразовать из 'System.Windows.Controls.TextBlock' в 'System.Type'

Любая помощь приветствуется.

Ответы [ 2 ]

9 голосов
/ 24 августа 2011
public DataTemplate Create(Type type)
{
    StringReader stringReader = new StringReader(
    @"<DataTemplate 
        xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> 
            <" + type.Name + @" Text=""{Binding " + ShowColumn + @"}""/> 
        </DataTemplate>");
    XmlReader xmlReader = XmlReader.Create(stringReader);
    return XamlReader.Load(xmlReader) as DataTemplate;
}

Назовите это так

TextBlock textBlock = new TextBlock();
Create(textBlock.GetType());
0 голосов
/ 24 августа 2011

Я скопировал ваш код с обходным решением для XmlReader, и он работал без проблем. Пожалуйста, попробуйте это:

 return (DataTemplate)XamlReader.Load(
                XmlReader.Create(
                    @"<DataTemplate  xmlns=""http://schemas.microsoft.com/client/2007""><" + type.Name + @" Text=""{Binding " + ShowColumn + @"}""/>
            </DataTemplate>"
             ));

Это должно работать.

...