我想禁用列 Field3 和 Field4 的选择 (参见图片)
Field1&2 值由用户输入,根据该值计算 Field3&4。
我想要的是 -
这是我目前的 XAML -
<Window x:Class="OrderCalculator.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:OrderCalculator"
mc:Ignorable="d"
Title="Order Estimate" Background="LightGray" Height="500" Width="800" Name="UI">
<Grid>
<DataGrid x:Name="ItemGrid" CanUserAddRows ="True" ItemsSource="{Binding ElementName=UI, Path=Items, Mode=TwoWay}" AutoGenerateColumns="False" HorizontalAlignment="Left"
Height="410" Margin="10,10,10,10" VerticalAlignment="Top" Width="420" HeadersVisibility="Column">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="DarkGray"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="BorderThickness" Value="0,0,1,2"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Field1" Binding="{Binding Path=field1, UpdateSourceTrigger=PropertyChanged}" Width="70"/>
<DataGridTextColumn Header="Field2" Binding="{Binding Path=field2, UpdateSourceTrigger=PropertyChanged}" Width="90"/>
<DataGridTextColumn Header="Field3" Binding="{Binding Path=field3, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" Width="110"/>
<DataGridTextColumn Header="Field4" Binding="{Binding Path=field4, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
更新
经过一番尝试后,我已经能够确保它不会通过鼠标单击被选中。但仍然可以使用箭头键和 Tab 键。到目前为止,我已经在 DataGrid.Resources 下的 XAML 中添加了以下内容-
<Style x:Key="DisableSelection" TargetType="DataGridCell">
<Setter Property="IsHitTestVisible" Value="False"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
然后对于我想要禁用选择的列 -
<DataGridTextColumn Header="Field3" CellStyle="{StaticResource DisableSelection}" Binding="{Binding Path=field3, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" Width="120"/>
Run Code Online (Sandbox Code Playgroud)
但正如前面提到的,这并不能完全解决问题。
解决了!将样式修改为 -
<Style x:Key="DisableSelection" TargetType="DataGridCell">
<Setter Property="Focusable" Value="False"/> <!-- Disables all selection methods (including keyboard inputs) -->
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderBrush" Value="Transparent"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
将“Focusable”属性设置为 false 就可以了。其余 3 行代码确保单元格看起来不可选择 = 没有突出显示,也没有选定的粗边框,同时确保文本仍然显示。
将此样式添加到我想完全禁用选择的列中 -
<DataGridTextColumn Header="Field1" CellStyle="{StaticResource DisableSelection}"...../>
Run Code Online (Sandbox Code Playgroud)