我有一个元素列表(带有纯文本块的简单按钮),这些元素是根据列表项内容进行颜色编码的。用户可以更新 Listitem,因此 listitem 颜色应该改变。对于某些列表项背景颜色,如“红色”,我也想添加一个图案。
我在 XAML 中添加了以下 VisualPatterns:
<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>
ListItem 中使用的按钮模板是:
<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>
目前,除了来自 VM 的 Button BackgroundClr 之外,我没有其他知识来确定我是否需要提供模式。
尝试过的解决方案
- 一种解决方案是拥有一个绑定属性 PatternName 并根据它确定要应用的模式:
上面的代码有效,但我必须在 VM 中有一个额外的属性
- 另一种解决方案是在 VM 中访问 VisualBrush 并直接在 BackgroundClr 中应用该模式——我还没有弄清楚如何做到这一点。
哪个是更好的解决方案或有任何其他方法可以实现相同的目标?
谢谢,
RDV