如何在代码中定义 DataTemplate?

Posted

技术标签:

【中文标题】如何在代码中定义 DataTemplate?【英文标题】:How to define a DataTemplate in code? 【发布时间】:2011-02-06 09:40:15 【问题描述】:

如何在代码中(使用 C#)创建 DataTemplate,然后向该 DataTemplate 添加控件?

<data:DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <Border>
            <Border Margin="10" Padding="10" BorderBrush="SteelBlue" 
                 BorderThickness="3" CornerRadius="5">
                <TextBlock Text="Binding Description" TextWrapping="Wrap" 
                     FontSize="10">
                </TextBlock>
            </Border>
        </Border>
    </DataTemplate>
</data:DataGrid.RowDetailsTemplate>

我正在使用 Sivlerlight。

【问题讨论】:

【参考方案1】:

据我所知,在 Silverlight 中创建 DataTemplate 的唯一方法是使用 XamlReader。基本上,您只需将 XAML 作为字符串传递给它,它就会返回一个DataTemplate。 Byron 的解决方案适用于 WPF,但 Silverlight(据我所知)不支持 FrameworkElementFactory

Scott Morrison: Defining Silverlight DataGrid Columns at Runtime

注意DataGridTemplateColumn 的选项#2。

【讨论】:

+1 这是正确的。我个人更喜欢使用 LinqToXml 对象来构建所需的 Xaml,但最终需要将结果字符串传递给 XamlReader 以编程方式创建 DataTemplate。【参考方案2】:

您可以使用FrameworkElementFactory 添加像TextBlock 这样的控件。然后你可以将TextBlock添加到DataTemplate的VisualTree中。像这样:

//Create binding object and set as mode=oneway
Binding binding = new Binding();
binding.Path = new PropertyPath("SomePropertyPathName");
binding.Mode = BindingMode.OneWay;

//get textblock object from factory and set binding
FrameworkElementFactory textElement = new FrameworkElementFactory(typeof(TextBlock));
textElement.SetBinding(TextBlock.TextProperty, binding);

//apply textblock to datatemplate
dataTemplate.VisualTree = textElement;

【讨论】:

OP 说他正在使用 Silverlight,据我所知不支持 FrameworkElementFactory。【参考方案3】:

Microsoft 在 MSDN 上有一篇很好的文章:“Data Templating Overview”。我会从那里开始。

更新:呃,从头开始。我阅读了您对“代码中”的要求。我将把链接留在这里,以供可能偶然发现这篇文章的人使用。

【讨论】:

以上是关于如何在代码中定义 DataTemplate?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中为自定义 DataTemplateSelector 获取 DataTemplate 的 x:DataType

[UWP]如何使用代码创建DataTemplate(或者ControlTemplate)

如何在 DataTemplate 的 DataType 属性中引用泛型类型?

如何在复选框事件上访问嵌套listview datatemplate中的标签名称

如何使 Combobox(自定义 DataTemplate)中的 SelectedItem 仅显示项目的特定属性

在后面的代码中创建 DataTemplate