在下面的XAML中,我有一个ItemsControl,其中有三个DataObjects。我使用DataTemplate将DataObjects显示为带有“X”的按钮。该按钮使用样式来设置其内容。
如果Setter.Value是“X”,一切都很好!然而,如果我将Setter.Value更改为TextBlock,其TextProperty为“X”,则“X”仅出现在最后一个按钮(第三个DataObject)上,前两个按钮为空。
这是一个错误吗?还是有人能够解释为什么会发生这种情况?
注1:这是一个虚构的示例,以分离遇到的问题。
注2:我在代码中放置了Setter.Value选项,以便您可以通过注释其中一个来重新创建成功和不成功的情况。
注3:似乎此问题特定于“Content”属性的Setter。如果我使用Background属性的Setter,则它会正确地应用于所有DataObjects。
如果Setter.Value是“X”,一切都很好!然而,如果我将Setter.Value更改为TextBlock,其TextProperty为“X”,则“X”仅出现在最后一个按钮(第三个DataObject)上,前两个按钮为空。
这是一个错误吗?还是有人能够解释为什么会发生这种情况?
注1:这是一个虚构的示例,以分离遇到的问题。
注2:我在代码中放置了Setter.Value选项,以便您可以通过注释其中一个来重新创建成功和不成功的情况。
注3:似乎此问题特定于“Content”属性的Setter。如果我使用Background属性的Setter,则它会正确地应用于所有DataObjects。
<Grid>
<Grid.Resources>
<Style x:Key="myButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Content">
<!--<Setter.Value>X</Setter.Value>-->
<Setter.Value><TextBlock Text="X" /></Setter.Value>
</Setter>
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="Red" />
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type DataObject}">
<Button Height="24" Width="24" Style="{StaticResource myButtonStyle}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Items>
<DataObject />
<DataObject />
<DataObject />
</ItemsControl.Items>
</ItemsControl>
</Grid>
解决方案:
遗憾的是,我仍无法解释为什么在将内容设置为控件(例如TextBlock)而非纯文本时,“Content”设置器只能在最后一个DataObject上工作而失败。然而,使用“ContentTemplate”而非“Content”进行设置正是Dmitry所建议的非常可接受的解决方法,它仍然允许重用样式。
<Grid>
<Grid.Resources>
<DataTemplate x:Key="textBlockWithX">
<TextBlock Text="X" />
</DataTemplate>
<Style x:Key="myButtonStyle" TargetType="{x:Type Button}">
<Setter Property="ContentTemplate" Value="{StaticResource textBlockWithX}" />
</Style>
</Grid.Resources>
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type DataObject}">
<Button Height="24" Width="24" Style="{StaticResource myButtonStyle}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Items>
<DataObject />
<DataObject />
<DataObject />
</ItemsControl.Items>
</ItemsControl>
</Grid>