【发布时间】:2018-04-09 17:47:53
【问题描述】:
我在 ContentControl 的资源中定义了几个 DataTemplate:
<DataTemplate DataType="{x:Type sys:String}">
<Label Content="{Binding}" HorizontalContentAlignment="Center" />
</DataTemplate>
<DataTemplate DataType="{x:Type dmodels:CBClient}"> <!-- Client Details Template -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Client Details" Background="{StaticResource brush_Client}" Foreground="White" Margin="0,0,1,0" VerticalAlignment="Center" />
<TextBlock Grid.Column="1" Text="Id:" Background="{StaticResource brush_Client}" Foreground="White" />
<TextBlock Grid.Column="2" Text="{Binding Path=ClientId}" Background="{StaticResource brush_Client}" Foreground="White" Margin="0,0,1,0" />
<Button Grid.Column="3" Style="{StaticResource EditButton}" />
</Grid>
</DataTemplate>
如果我返回一个 CBClient 对象,我会从定义的 DataTemplate 中获得正确的显示。
如果我返回一个字符串,我会得到一个 StackOverflowException。
如果我消除 String DataTemplate 并返回一个字符串,我会显示该字符串,但没有按照我想要的格式进行格式化。
我做错了什么?我是否必须将基本字符串返回包装到一个完整的类中,并公开一个消息属性?有没有办法将复杂对象与 DataTemplates 的整数类型结合起来?
谢谢。
J
【问题讨论】:
-
与答案中所说的不同,标签没有“自动生成”TextBlock。您的问题是 Label 是一个 ContentControl,它可能会自动选择一个 ContentTemplate。当您的数据类型是字符串时,标签会选择您的 DataTemplate,而后者又包含另一个标签,该标签会再次选择您的 DataTemplate,无穷无尽。
-
谢谢,@Clemens。我认为,这对于错误是有道理的。是不是因为 Label 是在 ContentControl 的资源范围内定义的,所以它也在查看同一组可用的 DataTemplates?我没有为标签本身定义任何数据模板。而且,显然,该范围(控制)之外的其他标签不受影响。
标签: wpf xaml datatemplate