Wpf 为什么字符串数据模板会导致堆栈溢出异常?

Wpf 为什么字符串数据模板会导致堆栈溢出异常?,wpf,xaml,datatemplate,Wpf,Xaml,Datatemplate,我在ContentControl的参考资料中定义了两个数据模板: <DataTemplate DataType="{x:Type sys:String}"> <Label Content="{Binding}" HorizontalContentAlignment="Center" /> </DataTemplate> <DataTemplate DataType="{x:Type dmodels:CBClient}"> <!-- Cl

我在ContentControl的参考资料中定义了两个数据模板:

<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

  • 如果我删除字符串DataTemplate并返回一个字符串,则会显示该字符串,但其格式不是我想要的

我做错了什么?我是否必须将基本字符串return包装成一个完整的类,并公开一个message属性?对于DataTemplates,是否无法将复杂对象与整数类型组合在一起

谢谢


J

您使用标签导致了并发症。如果绑定到字符串,它会自动生成文本块。如果依赖于自动添加textblock,那么以这种方式绑定会产生奇怪的效果。我认为这是因为它看到的是对象,而不是绑定属性类型中的字符串。 你可以这样做:

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


如果您没有将标签用于另一个控件,则只需使用TextBlock并将中心与TextAlignment=“center”对齐即可。我想强调的是,如果你明确地给标签一个文本块作为内容,标签是如何工作的。与回答中提到的不同,没有文本块是由标签“自动生成”的。您的问题是标签是ContentControl,它可能会自动选择ContentTemplate。当您的数据类型为string时,标签会选择您的DataTemplate,而DataTemplate又包含另一个标签,该标签会再次选择您的DataTemplate,ad infinitum。谢谢,@Clemens。我认为这对于错误是有道理的。是否因为标签是在ContentControl的资源范围内定义的,所以它也在查看同一组可用的数据模板?我没有为标签本身定义任何数据模板。显然,该范围(控制范围)之外的其他标签没有受到影响。