WPF编辑资源字典动态传递参数

时间:2015-03-16 09:24:59

标签: c# wpf datagrid

我在资源字典中定义了一个样式,因此样式可以在我的应用程序中使用。

<Style x:Key="HyperlinkStyle" TargetType="{x:Type Hyperlink}">
        <Setter Property="Foreground" Value="{StaticResource Color3}" />
        <Setter Property="Cursor" Value="Hand" />
        <Setter Property="TextBlock.TextDecorations" Value="{x:Null}" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="{StaticResource Color3Pressed}" />
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Foreground" Value="{StaticResource Color2NotEnabled}" />
            </Trigger>
        </Style.Triggers>
    </Style>

我在Datagrid中使用这样的样式:

<DataGridTemplateColumn Width="140*"  CanUserReorder="False" CanUserResize="True" Header="">
                            <DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate />
                            </DataGridTemplateColumn.CellEditingTemplate>
                            <DataGridTemplateColumn.CellStyle>
                                <Style TargetType="DataGridCell" BasedOn="{StaticResource DatagridCellHyperlinkStyle}">
                                    <Setter Property="IsEnabled" Value="{Binding Path=MyObject, Converter={StaticResource ConverterMyObject}}"/>
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate>
                                                <Border Padding="{TemplateBinding Padding}"  VerticalAlignment="Center">
                                                    <TextBlock Width="Auto" Height="Auto" TextTrimming="CharacterEllipsis">
                                            <Hyperlink IsEnabled="{TemplateBinding IsEnabled}">
                                             <InlineUIContainer TextDecorations="{Binding Path=TextDecorations, RelativeSource={RelativeSource AncestorType=TextBlock}}" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType=TextBlock}}">
                                              <ContentPresenter Width="Auto" Height="Auto" Content="{Binding DataContext.MyObject.Name, RelativeSource={RelativeSource AncestorType=DataGridRow}}"/>
                                             </InlineUIContainer>
                                                <Hyperlink.Style>
                                                    <Style TargetType="Hyperlink" BasedOn="{StaticResource HyperlinkStyle}">
                                                                    <EventSetter Event="Hyperlink.Click" Handler="Clic" />


                                                        </Style>
                                                </Hyperlink.Style>
                                            </Hyperlink>
                                                    </TextBlock>
                                                </Border>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </DataGridTemplateColumn.CellStyle>
                        </DataGridTemplateColumn>

这很好但我希望能够根据参数在我的风格中使用2种颜色。

例如,我的数据网格有1500行,我想通过更改超链接颜色来突出显示集合中的100行。

所以我认为最好的方法是将超链接的Tag属性设置为自定义值并在样式中使用它。根据这个答案:https://social.msdn.microsoft.com/Forums/vstudio/en-US/d3424267-ed1f-4b30-90a1-5cca9843bd22/problem-making-a-trigger-on-the-tag-property?forum=wpf,我做了以下更改:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

首先,我为每一行手动设置标记,以查看样式是否更改:

<Hyperlink IsEnabled="{TemplateBinding IsEnabled}" Tag="10">

并将此触发器添加到我的超链接样式:

<Trigger Property="Tag">
            <Trigger.Value>
                <sys:Byte>10</sys:Byte> <!-- My highlighted object -->
            </Trigger.Value>
            <Setter Property="Foreground" Value="{StaticResource Color1}" />
        </Trigger>

但是当我启动我的应用程序时它不起作用(我仍然有“Color3”,而当Tag等于10时我想要“Color1”。 我检查了输出没有任何错误。

我试图通过“sys:String”更改“sys:Byte”,但结果是一样的。

我是否需要针对此问题更改方法?我读过也许我们不能在Tag Property上添加触发器。

谢谢

1 个答案:

答案 0 :(得分:0)

我建议你设置这样的标签

<Hyperlink IsEnabled="{TemplateBinding IsEnabled}" Tag="10">

然后以相同的方式编写触发器:

<Trigger Property="Tag" Value="10">
   ...setter
</Trigger>

或者如果在超链接中使用字节类型作为标记:

<Hyperlink IsEnabled="{TemplateBinding IsEnabled}">
    <Hyperlink.Tag>
       <sys:Byte>10</sys:Byte>
    </Hyperlink.Tag>
</Hyperlink>

然后触发器也一样:

<Trigger Property="Tag">
    <Trigger.Value>
       <sys:Byte>10</sys:Byte>
    </Trigger.Value>
   ...setter
</Trigger>