XAML:如何从DataRow样式触发到DataGrid单元设置器?

时间:2015-07-01 16:30:14

标签: wpf xaml


我在XAML中使用DataGrid 我为一个行上的鼠标悬停定义了一种特定的样式 这是通过<DataGrid.RowStyle>标记的内容定义的。

对于特定列(最后一列),我想插入一个图标,该图标仅在鼠标悬停时可见。要将其隐藏在默认状态,我将前景颜色定义为透明,在<DataGridTextColumn.CellStyle>标记内容中定义。

全球XAML下方

        <DataGrid.Columns>

            <!-- FIRST COLUMN DECLARATION -->
            <DataGridTextColumn Binding="{Binding Container}" Header="Container" Width="*">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="VerticalAlignment" Value="Center" />
                        <Setter Property="HorizontalAlignment" Value="Left" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>

            <!-- ICON COLUMN DECLARATION -->
            <DataGridTextColumn Binding="{Binding Icon}" Header="" Width="30" CanUserResize="False">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="VerticalAlignment" Value="Center" />
                        <Setter Property="HorizontalAlignment" Value="Left" />
                    </Style>
                </DataGridTextColumn.ElementStyle>

                <!-- DECLARE THE SPECIFIC TRANSPARENT COLOR -->
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="DataGridCell" >
                        <Setter Property="Foreground" Value="Transparent"/>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>
        </DataGrid.Columns>

        <!-- MOUSEOVER ROW STYLE, which is not taken in account by second column -->
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="#FF27222A"/>
                            <Setter Property="Foreground" Value="#FF31A4CF" />            
                            <Setter Property="FontWeight" Value="ExtraBold" />
                            <Setter Property="Cursor" Value="Hand"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
        </DataGrid.RowStyle>
    </DataGrid>

问题是单元格中定义的样式会覆盖行中定义的样式。鼠标悬停情况也是如此,这意味着我的触发器不会考虑该特定列(换句话说,最后一列的所有单元格)。

我试图用下面的TargetName声明一个Setter,但没有成功使它工作,主要是因为我不知道在项目中没有触发错误的情况下设置x:Name的位置。

 <Setter Property="Foreground" Value="#FF31A4CF" TargetName="IconCol" />

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

确定。它有用,但部分失败,因为我最终引入了C#代码来处理Cell样式 我在<DataGrid.RowStyle>标记中为MouseEnter和MouseLeave插入了一些 EventSetter

以下是XAML更新部分:

<DataGrid.RowStyle>
      <Style TargetType="DataGridRow" BasedOn="{StaticResource BaseDataGridRowStyle}">

                <EventSetter Event="MouseEnter" Handler="Row_MouseEnter"/>
                <EventSetter Event="MouseLeave" Handler="Row_MouseLeave"/>

                <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="#FF27222A"/>
                                <Setter Property="Foreground" Value="#FF31A4CF" /> 
                                <Setter Property="FontWeight" Value="ExtraBold" />
                                <Setter Property="Cursor" Value="Hand"/>
                        </Trigger>

                        <Trigger Property="IsSelected" Value="True">
                                <Setter Property="Background" Value="#FF27222A" />
                                <Setter Property="Foreground" Value="#FF31A4CF" />
                                <Setter Property="FontWeight" Value="ExtraBold" />
                        </Trigger>
                </Style.Triggers>
      </Style>
</DataGrid.RowStyle>

然后,当事件被分派到C#代码时,我直接访问所需的单元格,以便在MouseOver情况下应用专用样式