содержимое независимо для каждого объекта, поэтому вы получаете один экземпляр для каждого элемента управления, к которому применяется стиль.

веденном ниже XAML у меня есть ItemsControl, который имеет три объекта DataObject.
Я использую DataTemplate для отображения DataObjects в виде кнопок с «X» на них.
Кнопка использует стиль для установки своего содержимого.

Если Setter.Value "X", все отлично работает!
Тем не менее, если я изменю Setter.Value на TextBlock, TextProperty которого является "X",X появляется только на последней кнопке (третий DataObject) и первые две кнопки пусты.

Это ошибка, или кто-нибудь может объяснить, почему это происходит?

Примечание 1) Это надуманный пример, позволяющий изолировать возникшую проблему.
Примечание 2) Я добавил в код обе опции Setter.Value, чтобы вы могли воспроизвести как успешные, так и неудачные случаи, просто закомментировав один из них.
Примечание 3) Похоже, что эта проблема относится к сеттерам для свойства «Содержимое». Если я использую 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>

Ответы на вопрос(2)

Ваш ответ на вопрос