DataGrid禁用编辑最初选择的其他行的功能

时间:2018-03-08 01:24:55

标签: c# wpf mvvm

我有一个数据网格,填充5列,在运行时我添加条目。 在这里,必须始终禁用/锁定前2列,因此我想为这些列设置ReadOnly。因此,我启用了DataGridCell.Selected =" DataGridGotFocus"在下面的xaml。

<DataGrid  Name="dataGrid1" DataGridCell.Selected="DataGridGotFocus" ItemsSource="{Binding Path=CollectionList}"                    
  SelectionMode="Single" AlternatingRowBackground="LightGray" AlternationCount="2" DockPanel.Dock="Right" CanUserAddRows="False"/>  

我的xaml.cs文件有以下

private void DataGridGotFocus(object sender, RoutedEventArgs e)
    {
            dataGrid1.Columns[0].IsReadOnly = true;
            dataGrid1.Columns[1].IsReadOnly = true;
            dataGrid1.Columns[2].IsReadOnly = false;
            dataGrid1.Columns[3].IsReadOnly = false;
            dataGrid1.Columns[4].IsReadOnly = false;

    }       

这里的问题是,当我第一次点击任意一行时,我能够编辑该行的单元格的值,但每隔一行都被锁定,我无法编辑。 此外,最初我继续点击不同行中的每个单元格,它打开进行编辑,但是当我键入任何内容时,只有该行一直启用。每隔一行,都会被禁用。拜托,请帮助我。

为什么行不可编辑?

感谢任何帮助!

编辑:我需要在所有行上启用编辑功能。我应该明确指定任何属性吗?或者我的xaml很好吗?

编辑:看起来像设置DataGridCell.Selected =&#34; DataGridGotFocus&#34;不是问题。当我在没有设置它们的情况下重试时,我仍然无法编辑我的行。

3 个答案:

答案 0 :(得分:0)

如果自动生成列,您可以使用AutoGeneratingColumn事件,它可以让您在添加到控件之前更改每个生成的列。&#34; (见DataGrid.AutoGeneratingColumn Event) 所以你可以这样做:

private void dataGrid1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyName == "FirstColumnProp")
    {
        e.Column.IsReadOnly = true;
    }
    else if ...
}

希望这能解决你的问题。

答案 1 :(得分:0)

问题是你让DataGrid自动为你生成列。这是一个简单的设置,可以快速查看行,但不允许您自定义DataGrid。我会专门指定列,以便您可以设置您想要读取或不读取的列。请注意AutoGenerateColumns="False"

<DataGrid  
    Name="dataGrid1" 
    AutoGenerateColumns="False"
    DataGridCell.Selected="DataGridGotFocus" 
    ItemsSource="{Binding Path=CollectionList}"
    SelectionMode="Single" 
    AlternatingRowBackground="LightGray" 
    AlternationCount="2" 
    DockPanel.Dock="Right" 
    CanUserAddRows="False">
    <DataGrid.Columns>
    <DataGridTextColumn
        Header="Column 1"
        IsReadOnly="True"
        Binding="{Binding ...}"/>
    <DataGridTextColumn
        Header="Column 2"
        IsReadOnly="True"
        Binding="{Binding ...}"/>
    <DataGridTextColumn
        Header="Column 3"
        Binding="{Binding ...}"/>
    ...
    </DataGrid.Columns>
</DataGrid>

答案 2 :(得分:0)

我发现了问题。这个问题似乎是验证问题。我似乎总是给那个可编辑的行中的一个单元格赋予不正确的值,当单元格验证失败时,DataGrid不会退出编辑模式。所以,这就是问题所在。但是没有任何暗示,因此我很难理解发生了什么。 感谢你的帮助。