我希望 wpf DataGrid 其余部分中的数据是只读的,并且只有新行应该是可编辑的

Posted

技术标签:

【中文标题】我希望 wpf DataGrid 其余部分中的数据是只读的,并且只有新行应该是可编辑的【英文标题】:I want data in the rest of wpf DataGrid to be read only and only new row should be editable 【发布时间】:2013-04-21 12:09:36 【问题描述】:

我已经设法让DataGrid 显示用于添加新项目的新行。 我现在面临的问题是我希望 wpf DataGrid 的其余部分中的数据是只读的,并且只有新行应该是可编辑的。

目前这是我的DataGrid 的外观。

<DataGrid AutoGenerateColumns="False" Name="DataGridTest" CanUserAddRows="True" Grid.Row="2" ItemsSource="Binding TestBinding" >
    <DataGrid.Columns>        
        <DataGridTextColumn Header="Line" IsReadOnly="True" Binding="Binding Path=Test1" Width="50"></DataGridTextColumn>
        <DataGridTextColumn Header="Account" IsReadOnly="True"  Binding="Binding Path=Test2" Width="130"></DataGridTextColumn>               
    </DataGrid.Columns>
</DataGrid>

但由于我将列保持为只读,因此新行也会添加为只读,这是我不想要的。

【问题讨论】:

【参考方案1】:

试试这个MSDN blog

另外,试试下面的例子:

Xaml:

   <DataGrid AutoGenerateColumns="False" Name="DataGridTest" CanUserAddRows="True" ItemsSource="Binding TestBinding" Margin="0,50,0,0" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Line" IsReadOnly="True" Binding="Binding Path=Test1" Width="50"></DataGridTextColumn>
            <DataGridTextColumn Header="Account" IsReadOnly="True"  Binding="Binding Path=Test2" Width="130"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Add new row" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>

CS:

 /// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window

    public MainWindow()
    
        InitializeComponent();
    

    private void Button_Click_1(object sender, RoutedEventArgs e)
    
        var data = new Test  Test1 = "Test1", Test2 = "Test2" ;

        DataGridTest.Items.Add(data);
    


public class Test

    public string Test1  get; set; 
    public string Test2  get; set; 

【讨论】:

至少在这个简单的例子中,你可以稍微简化一下,根本不用声明 Test 类。改为匿名类型:DataGridTest.Items.Add(new Test1 = "Test1", Test2 = "Test2" ); 我正在使用相同的方法,但在某些行之后它显示空引用错误 @Dave Clemmer .,我如何在 ViewModel 中做到这一点。 这个解决方案的一个大问题是DataGridColumnIsReadOnly 属性不可出价,这与DataGrid 本身的IsReadOnly 相反。【参考方案2】:

只需使用 Style 中的 DataGridRow 即可:

<DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsEnabled" Value="Binding RelativeSource=RelativeSource Self,Path=IsNewItem,Mode=OneWay" />
        </Style>
</DataGrid.RowStyle>

【讨论】:

简洁明了,这应该是公认的答案。 @TalhaTalipAçıkgöz 这就是 OP 想要的

以上是关于我希望 wpf DataGrid 其余部分中的数据是只读的,并且只有新行应该是可编辑的的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid中的数据绑定未显示在窗体上

使用 TemplateColumns 将 WPF DataGrid 绑定到 DataTable

wpf datagrid 滚动条如何设置宽度和颜色

在 WPF 中对 DataGrid 进行预排序

如何在C#/ wpf中启用datagrid列文本

WPF DataGrid 动态样式