为什么String DataTemplate会导致堆栈溢出异常?

时间:2018-04-09 17:47:54

标签: wpf xaml datatemplate

我在ContentControl的资源中定义了几个DataTemplates:

<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的整数类型组合在一起?

感谢。

Ĵ

1 个答案:

答案 0 :(得分:0)

您使用Label引入了并发症。如果绑定到字符串,它会自动生成文本块。如果依靠它自动添加文本块,以这种方式绑定会产生奇怪的效果。我应该认为这是因为它看到的是一个对象,而不是来自您绑定的属性类型的字符串。 你可以这么做:

<DataTemplate DataType="{x:Type sys:String}">
    <Label HorizontalContentAlignment="Center">
        <TextBlock Text="{Binding}" />
    </Label>
</DataTemplate>