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
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de travail:
Edit1 Doh.. il a Obtenu le travail, l'astuce est d'utiliser ContentTemplate.
Edit2: d'Un échantillon de plus complexe ContentTemplate:
La réponse est plutôt simple en fait, chaque visual ne peut être l'enfant d'un objet, à la différence du texte comme
"X"
qui est juste des données.Si vous créez un style comme ceci:
Seulement un
TextBlock
est créé pour tous les cas où le style est appliqué, de sorte que leTextBlock
va "sauter" sur chaque application et à la fin, jusqu'au dernier élément.Si vous définissez la
ContentTemplate
cependant vous créer comme son nom l'indique un modèle qui est utilisé pour générer le contenu independenctly pour chaque objet si vous vous retrouvez avec une instance par le contrôle où le style s'applique.