将背景颜色更改为基于

时间:2016-09-20 23:01:13

标签: wpf design-patterns mvvm visualbrush

我有一个元素列表(带有纯文本块的简单按钮),它们根据列表项内容进行颜色编码。用户可以更新Listitem,因此listitem颜色应该更改。对于某些listitem背景颜色,如" Red",我也想添加一个模式。

我在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之外没有其他任何知识来确定我是否需要提供模式。

  • 尝试过的解决方案

    1. 一种解决方案是使用绑定属性PatternName并根据它确定要应用的模式:
    2.     

上面的代码有效,但我必须在VM中有一个额外的属性

  1. 另一个解决方案是在VM中访问VisualBrush并直接在BackgroundClr中应用模式 - 我还没有弄清楚如何做到这一点。
  2. 哪个是更好的解决方案还是有其他方法可以实现相同的目标?

    谢谢,

    RDV

1 个答案:

答案 0 :(得分:0)

{Binding BackgroundClr}更改为{Binding BackgroundClr.Color}