为什么一个String DataTemplate会导致栈溢出异常?
Why does a String DataTemplate cause a stack overflow exception?
我在 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>
如果我 return 一个 CBClient 对象,我从定义的 DataTemplate 得到正确的显示。
如果我 return 一个字符串,我会得到一个 WhosebugException。
如果我删除 String DataTemplate 和 return 一个字符串,我会显示字符串,但不会按我想要的格式设置。
我做错了什么?我是否必须将基本字符串 return 包装成完整的 class,并公开一条消息 属性?有没有办法将复杂对象与 DataTemplates 的整数类型结合起来?
谢谢。
J
您使用标签引入了复杂功能。如果您绑定到一个字符串,它会自动生成一个文本块。如果您依靠它自动添加文本块,以这种方式绑定会产生奇怪的效果。我应该认为这是因为它看到的是一个对象,而不是来自您要绑定的 属性 类型的字符串。
你可以这样做:
<DataTemplate DataType="{x:Type sys:String}">
<Label HorizontalContentAlignment="Center">
<TextBlock Text="{Binding}" />
</Label>
</DataTemplate>
我在 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>
如果我 return 一个 CBClient 对象,我从定义的 DataTemplate 得到正确的显示。
如果我 return 一个字符串,我会得到一个 WhosebugException。
如果我删除 String DataTemplate 和 return 一个字符串,我会显示字符串,但不会按我想要的格式设置。
我做错了什么?我是否必须将基本字符串 return 包装成完整的 class,并公开一条消息 属性?有没有办法将复杂对象与 DataTemplates 的整数类型结合起来?
谢谢。
J
您使用标签引入了复杂功能。如果您绑定到一个字符串,它会自动生成一个文本块。如果您依靠它自动添加文本块,以这种方式绑定会产生奇怪的效果。我应该认为这是因为它看到的是一个对象,而不是来自您要绑定的 属性 类型的字符串。 你可以这样做:
<DataTemplate DataType="{x:Type sys:String}">
<Label HorizontalContentAlignment="Center">
<TextBlock Text="{Binding}" />
</Label>
</DataTemplate>