【发布时间】:2011-07-07 10:08:00
【问题描述】:
在下面的 XAML 中,我有一个 ItemsControl,它包含三个 DataObject。
我使用 DataTemplate 将 DataObjects 显示为带有“X”的按钮。
Button 使用样式来设置其内容。
如果 Setter.Value 为“X”,则一切正常!
但是,如果我将 Setter.Value 更改为 TextProperty 为“X”的 TextBlock,X 仅出现在最后一个 Button(第三个 DataObject)上,而前两个 Button 为空。
这是一个错误吗,或者任何人都可以解释为什么会发生这种情况?
注 1)这是一个人为的示例,用于隔离遇到的问题。
注 2)我已将两个 Setter.Value 选项都放在代码中,因此您只需将其中一个注释掉即可重现成功和不成功的案例。
注 3)看来,这个问题是特定于“内容”属性的设置器。如果我为 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>
解决办法:
不幸的是,我仍然无法解释为什么当 Content 设置为控件(例如 TextBlock)而不是纯文本时,“Content”Setter 无法在除最后一个 DataObject 之外的所有数据对象上工作。但是,Dmitry 建议使用设置“ContentTemplate”而不是“Content”是一种非常可接受的解决方法,它仍然允许可重复使用的样式。
<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>
【问题讨论】:
-
嗨,您显然知道罪魁祸首是 DataTemplate 中的样式,一旦您将 Content 用作普通属性,一切都会开始工作。
-
在这个人为/简化的示例中肯定有一个解决方法。但我不确定我理解为什么这是“设计”。将 Content Setter 的值设置为“X”有效...但将其设置为 TextBlock 仅适用于最后一项...对我来说似乎很奇怪。
标签: wpf xaml styles datatemplate itemscontrol