Style dans DataTemplate est seulement appliqué au dernier élément dans ItemsControl?

Dans le XAML, ci-dessous, j'ai un ItemsControl a trois DataObjects.
J'utilise un DataTemplate pour afficher DataObjects que des Boutons avec un "X" sur eux.
Le Bouton utilise un Style de jeu de son Contenu.

Si le Setter.La valeur "X", tout fonctionne très bien!
Cependant, si je change le Setter.La valeur d'un TextBlock dont TextProperty est "X", le X n'apparaît que sur le dernier Bouton (la troisième DataObject) et les deux premiers Boutons sont vides.

Est-ce un bug, ou quelqu'un peut-il expliquer pourquoi cela se produit?

Note 1) C'est un exemple artificiel d'isoler le problème rencontré.
Note 2) j'ai mis les deux Setter.La valeur des options dans le code de sorte que vous pouvez reproduire à la fois la réussite et à l'échec des cas, tout en ayant un d'entre eux a commenté.
Note 3), Il apparaît, ce problème est spécifique à Setters pour la propriété 'Content'. Si j'utilise un Setter de la propriété Background, c'correctement s'applique à tous les 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>

Solution:

Malheureusement, je ne peux toujours pas expliquer pourquoi le "Contenu" Setter ne fonctionne pas sur tous, mais le dernier DataObject lorsque le Contenu est fixé à un contrôle tel qu'un TextBlock plutôt que le texte de droite.

Cependant, Dmitry la suggestion de paramètre à l'aide de la "ContentTemplate' au lieu de 'Contenu' est une bonne solution de contournement qui permet encore une ré-utilisable Style.

<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>

source d'informationauteur

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *