代码之家  ›  专栏  ›  技术社区  ›  Bandook

WPF DataGrid-禁用特定列选择

  •  0
  • Bandook  · 技术社区  · 7 年前

    我想禁用字段3列的选择;字段4 (see image)

    字段1和;2个值由用户输入,具体取决于it字段3&计算了4个。

    1. 使用“制表符”在输入单元格中移动时,所选内容应从第1行字段2移动到第2行字段1。
    2. 可以删除行(提到这一点是因为我不确定实现其他点之后的行为)。

    <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>
    

    更新

    玩过之后,我已经能够确保它不会被鼠标点击选中。但它仍然可以与箭头键和制表符。到目前为止我有这个-

    <Style x:Key="DisableSelection" TargetType="DataGridCell">
        <Setter Property="IsHitTestVisible" Value="False"/>
    </Style>
    

    然后对于我想禁用选择的列-

    <DataGridTextColumn Header="Field3" CellStyle="{StaticResource DisableSelection}" Binding="{Binding Path=field3, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" Width="120"/>
    

    但如前所述,这并不能完全解决问题。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Bandook    7 年前

    解决了! 将样式修改为-

    <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>
    

    将此样式添加到我想要完全禁用选择的列中-

    <DataGridTextColumn Header="Field1" CellStyle="{StaticResource DisableSelection}"...../>