XamlReader生成DataTemplate时出现问题

6

我正在尝试在我的WPF项目中实现以下代码,以便为具有动态列的DataGrid动态生成DataTemplates。 我在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代码上,我遇到了错误“无法将'string'转换为'System.Xaml.XamlReader'。

我尝试通过更改代码来解决这个问题:

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

但是我得到了关于字符串传递无效字符的错误。
同时,我不确定如何将TextBlock传递给这个代码。我想我只需要创建一个TextBlock并将其作为类型参数传递,但我得到了"无法将'System.Windows.Controls.TextBlock'转换为'System.Type'"的错误。
任何帮助都将不胜感激。

在默认命名空间中有多少个独特的控件拥有“Text”属性? - AnthonyWJones
2个回答

10
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());

1
+1 对于 GetType,但我不认为 XmlReader、StringReader 真的是必要的。 - AnthonyWJones
@AnthonyWJones:你是正确的,只需在XamlReader.Load中使用XmlReader.Create即可。 - Fredrik Hedblad
我可能很无知,但是在传递给StringReader的字符串中,@的目的是什么? - Adarsha
Adarsha - 它允许您在多行上拥有一个字符串,而无需显式连接(+)。 - Chris Klepeis
问题在于该模板无法使用x:Bind。 - sjb-sjb
显示剩余3条评论

0

我使用了XmlReader的解决方法复制了您的代码,没有任何问题,可以尝试一下:

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

这应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接