在WPf数据网格中检查是否有任何选定的单元格是ReadOnly

时间:2016-02-03 07:15:24

标签: wpf datagrid

我有一个包含可编辑和只读单元格的网格。在选择单元格时,如果至少有一个单元格是可编辑的(不是只读单元格),我必须从工具栏中启用“剪切”和“粘贴”图标。

我已将剪切/粘贴图标的IsEnabled属性绑定到属性CanPerformCutPaste

这是当前正在运行的代码。

private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
   CanPerformCutPaste = dataGrid.SelectedCells.Any(c => !GetDataGridCell(c, dataGrid).IsReadOnly);
}


public static DataGridCell GetDataGridCell(DataGridCellInfo cellInfo, DataGrid grid)
{
       if (cellInfo == null || grid == null)
          return null;

       grid.ScrollIntoView(cellInfo.Item as DataRowView, cellInfo.Column);
       var cellContent = cellInfo.Column.GetCellContent(cellInfo.Item);
       if (cellContent != null)
          return (DataGridCell)cellContent.Parent;

       return null;
}

有没有更好的方法来实现此功能?我不希望这会导致大量单元格的性能问题。

修改 列永远不会设置为只读。只有一些基于条件的单元格是只读的。因此无法检查列属性。

1 个答案:

答案 0 :(得分:0)

您最有可能想要检查最后选择的Cell,而不是每次检查所有选定的单元格,除了检查所选单元格的列属性就足够了,这里有一个简单的例子:

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Button Content="Copy/Past" Grid.Row="0" IsEnabled="{Binding CanPerformCutPaste}"></Button>
    <DataGrid  ItemsSource="{Binding Items}" x:Name="Dg" Grid.Row="1" AutoGenerateColumns="False" SelectionUnit="Cell" SelectedCellsChanged="Dg_OnSelectedCellsChanged">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True"/>
            <DataGridTextColumn Header="Location" Binding="{Binding Location}"/>
        </DataGrid.Columns>
    </DataGrid>                  
</Grid>

和SelectedCellsChanged处理程序:

   private void Dg_OnSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        if (Dg.SelectedCells.Any())             
        CanPerformCutPaste = Dg.SelectedCells.Last().Column.IsReadOnly;
    }

Ps:我相信你知道vm应该实现INotifyPropertyChanged接口

private bool _canPerformCutPaste  ;
    public bool CanPerformCutPaste
    {
        get
        {
            return _canPerformCutPaste;
        }

        set
        {
            if (_canPerformCutPaste == value)
            {
                return;
            }

            _canPerformCutPaste = value;
            OnPropertyChanged();
        }
    }