28

如何在代码中创建 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

4 回答 4

39

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

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

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

于 2008-09-16T13:28:40.483 回答
11

这段代码我遇到了一些问题,得到了 element not foung 异常。仅供参考,我需要将我的命名空间包含在 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);
        }
于 2008-12-10T13:38:31.160 回答
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。

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

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

FindName 仅适用于 WPF

于 2011-08-18T01:58:16.423 回答
2

来自 MSDN 的引用

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

于 2008-09-15T13:28:04.330 回答