在代码中创建Silverlight DataTemplate

时间:2008-09-12 16:31:06

标签: silverlight

如何在代码中创建silverlight数据模板?我见过很多WPF的例子,但Silverlight没有。

编辑:以下是我现在使用此代码的代码,基于以下圣地亚哥的答案。

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

这非常好用,并允许我动态更改绑定。

4 个答案:

答案 0 :(得分:39)

虽然您无法以编程方式创建它,但您可以使用以下代码从XAML字符串加载它:

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

上面的代码片段创建了一个包含单个控件的数据模板,该控件可能是一个包含所需内容的用户控件。

答案 1 :(得分:11)

我对这段代码有一些问题,找不到元素的异常。仅供参考,我需要在DataTemplate中包含我的命名空间...

private DataTemplate Create(Type type)
        {
            string xaml = @"<DataTemplate 
                xmlns=""http://schemas.microsoft.com/client/2007""
                xmlns:controls=""clr-namespace:" + type.Namespace + @";assembly=" + type.Namespace + @""">
                <controls:" + type.Name + @"/></DataTemplate>";
            return (DataTemplate)XamlReader.Load(xaml);
        }

答案 2 :(得分:4)

是的,Silverligt 4早于WPF的当前版本。 当您添加模板作为资源时,就像我一样 我在ResourceDictionary之间的Application.xaml MergedResources中添加了一个userControl模板。 在XAML中,如果标记实现了IDictionary,则可以使用x:Key属性。像那样

   <ResourceDictionary>
    <DataTemplate x:Key="TextBoxEditTemplate">
    <Some user control x:Name="myOwnControl" />
    </DataTemplate>
   </ResourceDictionary>

确定!您可以通过编码 Application.Current.resources [“TextBoxEditTemplate”] 来访问您的模板 另一方面,一些查找此模板成员的方法将不起作用。除此之外,DataTemplate不实现IDictionary,因此您无法为此dataTemplate中的项分配x:Key属性。作为示例中的myOwnControl。

没有xaml当前,Silverlight对创建完全动态的代码隐藏DataTemplates有一些限制。即使它适用于WPF。

无论如何,此时最好的解决方案是为datatemplate创建XAML脚本,您可以在DataTemplate脚本中添加一些值元素。我们创建了自己的usercontrols,它有一些DependencyObjectProperty属性......

最后如果你的对象没有继承,即。不是MyControl:UserControl您可以通过这种方式继承 MyObject:DependencyObject ,通过调用Application.Current.Resources.FirstChilderen ...

来访问您的对象

FindName仅适用于WPF

答案 3 :(得分:2)

citation from MSDN

  

定义用于创建数据模板的内容的XAML用法不会作为可设置属性公开。它是构建在DataTemplate对象元素的XAML处理中的特殊行为。