В приведенном ниже XAML у меня есть ItemsControl, который имеет три объекта DataObject.
Я использую шаблон данных для отображения объектов DataObject в виде кнопок с символом «X».
Кнопка использует стиль для установки своего содержимого.
Если значение Setter.Value равно "X", все отлично работает!
Однако, если я изменю значение Setter.Value на TextBlock, TextProperty которого равно "X", X отображается только напоследняя кнопка (третий объект DataObject) и первые две кнопки пусты.
Это ошибка, или кто-нибудь может объяснить, почему это происходит?
Примечание 1) Это надуманный пример, позволяющий локализовать возникшую проблему.
Примечание2) Я поместил в код обе опции Setter.Value, чтобы вы могли воспроизвести как успешные, так и неудачные случаи, просто закомментировав один из них.
Примечание 3) Похоже, эта проблема характерна только для Setters дляСвойство «Контент».Если я использую Setter для свойства Background, он корректно применяется ко всем объектам DataObject.
<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>
Решение:
К сожалению, я все еще не могу объяснить, почему Setter «Content» не удаетсяработать со всеми объектами, кроме последнего объекта DataObject, если для Content задан элемент управления, например TextBlock, а не прямой текст.
Однако предложение Дмитрия использовать параметр 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>