J'ai une liste d'éléments (boutons simples avec bloc de texte brut) qui sont codés en couleur en fonction du contenu de l'élément de liste. L'utilisateur peut mettre à jour le Listitem et ainsi la couleur de listitem devrait changer. Pour certaines couleurs d'arrière-plan de liste comme "Rouge", je veux aussi ajouter un motif.Modification de la couleur d'arrière-plan à un modèle visuel basé
J'ai ajouté les VisualPatterns suivants en XAML:
<Window.Resources>
<VisualBrush x:Key="FwdPattern" TileMode="Tile" Viewport="0,0,15,15" ViewportUnits="Absolute" Viewbox="0,0,15,15" ViewboxUnits="Absolute">
<VisualBrush.Visual>
<Grid>
<Path Data="M 0 15 L 15 0" Stroke="Gray" />
</Grid>
</VisualBrush.Visual>
</VisualBrush>
<VisualBrush x:Key="BckPattern" TileMode="Tile" Viewport="0,0,15,15" ViewportUnits="Absolute" Viewbox="0,0,15,15" ViewboxUnits="Absolute">
<VisualBrush.Visual>
<Grid>
<Path Data="M 0 0 L 15 15" Stroke="Gray" />
</Grid>
</VisualBrush.Visual>
</VisualBrush>
</Window.Resources>
modèle de bouton utilisé dans ListItem est:
<Border Background="{Binding BackgroundClr}">
<Button Name="MyButton" Content="Testing">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="{Binding BackgroundClr}"/>
<Style.Triggers>
<!-- This does not work, see [http://stackoverflow.com/questions/39583263/brush-mvvm-binding-does-not-give-named-color/39583422#39583422][1] -->
<DataTrigger Binding="{Binding BackgroundClr}" Value="Red">
<Setter Property="Background" Value="{StaticResource BckPattern}"/>
</DataTrigger>
<!-- This does not work either, it goes in infinite loop
and StackOverflow exception is thrown-
probably because I am reading the background color in
the datatrigger and again updating it- but i dont know-->
<DataTrigger Binding="{Binding Background.Color, RelativeSource={RelativeSource Self}}" Value="Red">
<Setter Property="Background" Value="{StaticResource BckPattern}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Border>
Actuellement je n'ai aucune autre connaissance, sauf le BackgroundClr Bouton de VM pour déterminer si je besoin de fournir un motif ou non.
Essayé Solutions
- Une solution est d'avoir un PatternName et en fonction propriété-dessus, déterminer quel modèle lié à appliquer:
Le code ci-dessus fonctionne, mais je dois avoir une propriété supplémentaire dans VM
- L'autre solution est d'accéder VisualBrush en VM et appliquer directement le modèle dans BackgroundClr - Je n'ai pas compris comment le faire encore.
Quelle est la meilleure solution ou existe-t-il un autre moyen d'obtenir la même chose?
Merci,