如何在代码中定义 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中的标签名称