DataGridCell.IsReadOnly
您可能认为可以绑定到一个属性,
例如像这样使用 XAML:
<!-- Won't work -->
<DataGrid Name="myDataGrid" ItemsSource="{Binding MyItems}">
<DataGrid.Resources>
<Style TargetType="DataGridCell">
<Setter Property="IsReadOnly" Value="{Binding MyIsReadOnly}" />
</Style>
</DataGrid.Resources>
<!-- Column definitions... -->
</DataGrid>
不幸的是,这不起作用,因为该属性不可写。
接下来您可能会尝试拦截和停止鼠标事件,但这不会阻止用户使用 F2 键进入编辑模式。
我解决这个问题的方法是在 DataGrid 上侦听,PreviewExecutedEvent
然后有条件地将其标记为已处理。
例如,通过将类似于此的代码添加到我的 Window 或 UserControl 的构造函数(或另一个更合适的地方):
myDataGrid.AddHandler(CommandManager.PreviewExecutedEvent,
(ExecutedRoutedEventHandler)((sender, args) =>
{
if (args.Command == DataGrid.BeginEditCommand)
{
DataGrid dataGrid = (DataGrid) sender;
DependencyObject focusScope = FocusManager.GetFocusScope(dataGrid);
FrameworkElement focusedElement = (FrameworkElement) FocusManager.GetFocusedElement(focusScope);
MyRowItemModel model = (MyRowItemModel) focusedElement.DataContext;
if (model.MyIsReadOnly)
{
args.Handled = true;
}
}
}));
通过这样做,单元格仍然是可聚焦和可选择的。
但是除非您的模型项允许给定行,否则用户将无法进入编辑模式。
通过使用 DataGridTemplateColumn,您不会受到性能成本或复杂性的影响。