【发布时间】:2012-11-17 12:08:51
【问题描述】:
问题
基本上我想做以下事情,但似乎我做不到:
UserControl myControl = new UserControl();
DataTemplate template = new DataTemplate(myControl);
问题:是否可以从 UserControl 实例构造 DataTemplate?如果没有,还有其他可能的解决方案吗?
真正的问题
我正在做一个项目,其中大多数 UI 视图都是简单的静态 Word 类文档(例如,一些文本字段,可能还有一些图像,没什么花哨的)。因为从事这个项目的大多数人都不是程序员,所以我们为 UI 生成设计了非常简单的内部标记语言。简单视图的标记示例如下:
First name: [Person.FirstName]
Last name: [Person.LastName]
Address: [Person.Address.Street], [Person.Address.City]
现在这些模板在运行时加载,并基于它们创建用户控件。在这种情况下,将创建一个用户控件,它只包含几个堆栈面板和文本块,因此生成的控件看起来有点像文本文档。 XAML 等效项类似于:
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="First name: "/>
<TextBlock Text={Binding Person.FirstName}
</StackPanel>
<StackPanel>
...
</StackPanel>
...
</StackPanel>
然后,我开始实现对列表的支持,但想不出如何做到这一点。理论上它很简单,我想出了以下语法(+ XAML 等价物):
[List Customers]
First name: [Person.FirstName]
Last name: [Person.LastName]
Address: [Person.Address.Street], [Person.Address.City]
[EndList]
->
<StackPanel>
<ItemsControl ItemsSource="{Binding Customers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
[Insert code from previous XAML example here]
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
但我不能这样做,因为我似乎无法直接从 UserControl instance 构造 DataTemplate。如果我的 UserControl 是 types 就没有问题,但它们不是。
一种可能的解决方案是我可以将 ItemsControl.Items 直接绑定到 UserControls 列表(而不是绑定到 ItemsSource 和 ItemTemplate),但是出于几个原因,这在我们的案例中是次优的。我愿意先尝试其他一些解决方案!
更新
为了澄清:我所拥有的只是 UserControl 类的普通实例,其中包含我需要的内容。例如
UserControl control = new UserControl();
var panel = new StackPanel();
panel.Children.Add(...);
panel.Children.Add(...);
control.Content = panel;
// How to use that control as ItemTemplate for ItemsControl?
// It seems that it is not possible directly but I want to
// know what my options are.
我没有针对它的类,因为我是在运行时构建它,并且我不想通过发出 IL 代码来动态创建新类型,因为这太痛苦了。
【问题讨论】:
标签: c# wpf user-controls datatemplate