如何让WPF DataGrid中ObservableCollection绑定的指定列设为只读?
解决方案
不需要使用ReadOnlyObservableCollection,有几种更简单的方式实现特定列只读的需求:
方法一:手动定义DataGrid列并设置只读
直接在XAML中明确定义所有列,给需要只读的列设置IsReadOnly="True":
<DataGrid Name="OptionsGrid" ItemsSource="{Binding Options}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="ID" Binding="{Binding Id}" IsReadOnly="True"/> <DataGridCheckBoxColumn Header="是否激活" Binding="{Binding IsActive}"/> <DataGridCheckBoxColumn Header="选项勾选" Binding="{Binding OptionCheck}"/> <DataGridTextColumn Header="选项名称" Binding="{Binding OptionName}"/> </DataGrid.Columns> </DataGrid>
这里关闭了自动生成列(AutoGenerateColumns="False"),手动配置每一列,其中ID列通过IsReadOnly="True"设置为只读,其他列保持可编辑。
方法二:利用自动生成列事件处理
如果希望保留自动生成列的特性,不想手动写所有列,可以通过DataGridAutoGeneratingColumn事件来动态设置列的只读属性:
第一步:在XAML中添加事件绑定
<DataGrid Name="OptionsGrid" ItemsSource="{Binding Options}" AutoGeneratingColumn="OptionsGrid_AutoGeneratingColumn"/>
第二步:在后台代码中实现事件逻辑
private void OptionsGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { // 判断当前生成的列是否是Id列 if (e.PropertyName == nameof(OptionsData.Id)) { e.Column.IsReadOnly = true; } }
这样DataGrid自动生成列时,会自动把Id列设为只读,其他列保持默认的可编辑状态。
方法三:从数据模型层面限制只读
把OptionsData中的Id属性改为仅可读(去掉setter),这样从数据源头就限制了修改:
public class OptionsData { // 仅保留getter,初始化时赋值 public string Id { get; } public bool IsActive { get; set; } public bool OptionCheck { get; set; } public string OptionName { get; set; } // 新增构造函数,用于初始化Id public OptionsData(string id) { Id = id; } }
初始化集合时需要用构造函数赋值:
Options = new ObservableCollection<OptionsData> { new OptionsData("123") { IsActive = true, OptionCheck = true, OptionName = "Name"}, new OptionsData("456") { IsActive = false, OptionCheck = false, OptionName = "Name2"}, };
这种方式下,即使DataGrid允许编辑,也无法修改Id属性,因为模型本身不提供设置的入口。
内容的提问来源于stack exchange,提问作者ChrisRun
相关产品推荐
相关产品推荐

