我有一个包含可编辑和只读单元格的网格。在选择单元格时,如果至少有一个单元格是可编辑的(不是只读单元格),我必须从工具栏中启用“剪切”和“粘贴”图标。
我已将剪切/粘贴图标的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;
}
有没有更好的方法来实现此功能?我不希望这会导致大量单元格的性能问题。
修改 列永远不会设置为只读。只有一些基于条件的单元格是只读的。因此无法检查列属性。
答案 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();
}
}