【问题标题】:Possible to change cell style when row is clicked WPF DataGrid?单击行时可以更改单元格样式 WPF DataGrid?
【发布时间】:2017-10-19 17:51:23
【问题描述】:

我想向 WPF DataGrid 中当前选择的任何行添加一个箭头指示符。如果有人有更好的方法,我愿意改变,但我要做的是使用 DataGridTemplateColumn 并为单元格和行使用两种不同的样式。

<DataGridTemplateColumn Header="ID" Width="50" CanUserSort="False">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBox Name="txtID" Text="{Binding ID, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch" MaxLength="20" />
                <TextBox Name="txtArrow" Text="&#x21E8;" HorizontalAlignment="Stretch" Visibility="{Binding IsRowSelected, Converter={StaticResource booleanToVisibility}}" />
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

基本上,我希望 txtArrow 文本框仅显示数据网格中选定的行。我想知道这是否可以通过纯 XAML 和样式来实现。我知道 WPF 在最左边的列有一个开箱即用的行指示器,但不幸的是我需要在第一列的右侧制作指示器txtID。这可能吗?

谢谢!

【问题讨论】:

  • 你的方法对我来说很好。

标签: c# wpf xaml wpfdatagrid wpf-style


【解决方案1】:

我没有更改样式,而是使用MultiDataTrigger 根据在​​数据网格中选择的行来显示我想要的箭头指示符。这是否是最好的解决方案还有待商榷,但行指示器只是我的单元格中网格(而不是堆栈面板)中的一个箭头文本字符,它与另一个文本框共享空间。代码如下:

<DataGridTemplateColumn Header="ID" Width="50" CanUserSort="False">
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Grid.ColumnDefinition Width="*" />
            <Grid.ColumnDefinition Width="*" />
            <TextBox Name="txtID" Text="{Binding ID, UpdateSourceTrigger=PropertyChanged}" MaxLength="20" />
            <TextBox Name="txtArrow" HorizontalAlignment="Stretch">
                <TextBox.Style>
                    <Style TargetType="TextBox" BaseOn="{StaticResource MyTextBoxStyle}">
                        <Style.Triggers>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}, Path=IsSelected}" Value="True" /> 
                                </MultiDataTrigger.Conditions>
                                <Setter Property="Text" Value="--&gt;" />
                            </MultiDataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>
            </TextBox>
        </Grid>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

【讨论】:

    【解决方案2】:
    <DataGrid>
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="ID" Width="50" CanUserSort="False">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBox Name="txtID" Text="{Binding ID, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch" MaxLength="20" />
                            <TextBox Name="txtArrow" Text="&#x21E8;" HorizontalAlignment="Stretch">
                                <TextBox.Visibility>
                                    <Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType=DataGridRow}">
                                        <Binding.Converter>
                                            <BooleanToVisibilityConverter/>
                                        </Binding.Converter>
                                    </Binding>
                                </TextBox.Visibility>
                            </TextBox>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2017-08-07
      • 2015-11-19
      • 2012-11-22
      • 2015-05-05
      • 1970-01-01
      相关资源
      最近更新 更多