【问题标题】:Creating a Silverlight DataTemplate in code在代码中创建 Silverlight DataTemplate
【发布时间】:2013-05-17 00:59:25
【问题描述】:

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

这非常好用,让我可以随时更改绑定。

【问题讨论】:

  • 我无法让它工作。问题解释here

标签: silverlight


【解决方案1】:

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

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

上面的sn-p创建了一个包含单个控件的数据模板,它可能是一个用户控件,里面有你需要的内容。

【讨论】:

  • 很好的答案 - 不知道为什么我自己没有想到!
【解决方案2】:

我在使用这段代码时遇到了一些问题,出现了 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);
        }

【讨论】:

  • 您不需要语句“DataTemplate dt = new DataTemplate();”因为它没有被使用。
  • 程序集名称 != 命名空间名称
【解决方案3】:

是的,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

【讨论】:

    【解决方案4】:

    citation from MSDN

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多