单击 WPF DataGrid 行时可以更改单元格样式吗?
Possible to change cell style when row is clicked WPF DataGrid?
我想向 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="⇨" HorizontalAlignment="Stretch" Visibility="{Binding IsRowSelected, Converter={StaticResource booleanToVisibility}}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
基本上,我希望 txtArrow
文本框仅针对数据网格中的选定行显示。我想知道这是否可以通过纯 XAML 和样式来实现。我知道 WPF 在最左边的列有一个开箱即用的行指示器,但不幸的是我需要在第一列 txtID
的右侧制作该指示器。这可能吗?
谢谢!
<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="⇨" 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>
我没有更改样式,而是使用 MultiDataTrigger
根据在数据网格中选择的行来显示我想要的箭头指示器。这是否是最佳解决方案还有待商榷,但行指示符只是我单元格中网格(而不是堆栈面板)内的箭头文本字符,与另一个文本框共享 space。代码如下:
<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="-->" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
我想向 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="⇨" HorizontalAlignment="Stretch" Visibility="{Binding IsRowSelected, Converter={StaticResource booleanToVisibility}}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
基本上,我希望 txtArrow
文本框仅针对数据网格中的选定行显示。我想知道这是否可以通过纯 XAML 和样式来实现。我知道 WPF 在最左边的列有一个开箱即用的行指示器,但不幸的是我需要在第一列 txtID
的右侧制作该指示器。这可能吗?
谢谢!
<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="⇨" 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>
我没有更改样式,而是使用 MultiDataTrigger
根据在数据网格中选择的行来显示我想要的箭头指示器。这是否是最佳解决方案还有待商榷,但行指示符只是我单元格中网格(而不是堆栈面板)内的箭头文本字符,与另一个文本框共享 space。代码如下:
<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="-->" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>