【问题标题】:WPF DataGrid - Disable certain column selectionWPF DataGrid - 禁用某些列选择
【发布时间】:2018-11-03 04:56:01
【问题描述】:

我想禁用列 Field3 和 Field4 的选择 (see image)

Field1&2 值由用户输入,根据它计算 Field3&4。

我想要什么 -

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

这是我目前的 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>

更新

在玩过之后,我已经能够确保它不会被鼠标点击选中。但它仍然可以使用箭头键和选项卡。到目前为止,我有这个 - 在 DataGrid.Resources 下的 XAML 中添加以下内容-

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

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

【问题讨论】:

    标签: wpf datagrid


    【解决方案1】:

    解决了! 将样式修改为 -

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

    将“Focusable”属性设置为 false 就可以了。其余 3 行代码确保单元格看起来不可选择 = 没有突出显示或选择粗边框,同时确保文本仍然出现。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多