【问题标题】:Why does a String DataTemplate cause a stack overflow exception?为什么 String DataTemplate 会导致堆栈溢出异常?
【发布时间】: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


【解决方案1】:

您使用标签引入了复杂功能。如果您绑定到字符串,它会自动生成一个文本块。如果您依赖它自动添加文本块,那么以这种方式绑定会产生奇怪的效果。我应该认为这是因为它从您要绑定的属性的类型中看到一个对象而不是字符串。 你可以这样做:

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

【讨论】:

  • 如果你不使用与另一个控件相关的标签,那么只需使用 TextBlock 并将中心与 TextAlignment="Center"
  • 确实如此。我想强调的是,如果你明确地给它一个文本块作为内容,标签将如何工作。
猜你喜欢
  • 2011-01-13
  • 2016-02-24
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 2018-07-01
  • 2010-09-11
相关资源
最近更新 更多